찾다

 >  Q&A  >  본문

ios - 我想知道 capturing self strongly in this block 警告造成的后果有哪些

项目上线了 但是一直有一个BUG修复不了 似乎那个crash崩溃地址每次都不同 所以很难定位类似libobjc.A.dylib objc_msgSend (sendMessage:)这样的错误

检查代码 发现有这么一个在ARC模式下的警告
capturing self strongly in this block is likely to lead to a retain cycle 这是一个block导致的循环引用
这个警告会导致什么问题 会导致直接崩溃吗 我想知道跟上面的崩溃有联系吗

PHPzPHPz2772일 전633

모든 응답(3)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-04-17 17:52:04

    둘 사이에는 몇 가지 차이점이 있습니다.
    objc_msgSend(sendMessage:)는 해제된 객체에서 메서드가 호출되기 때문입니다.

    이 블록에서 자체를 강력하게 캡처하면 유지 주기가 발생할 가능성이 높습니다
    생성된 객체가 해제되지 않게 됩니다.
    예를 들어 vc를 입력할 때마다 새로 생성됩니다. vc의 블록에는 self에 대한 강력한 참조가 있습니다.
    이로 인해 해당 VC를 출시할 수 없게 됩니다. 들어갈 때마다 새로운 VC가 생성되며 이전 VC는 계속 존재하게 됩니다. 마지막으로 애플리케이션은 너무 많은 메모리를 차지하므로 시스템에서 삭제됩니다.

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-17 17:52:04

    가능하지만 가능성은 낮지만 순환 참조를 제거해야 합니다.

    회신하다
    0
  • ringa_lee

    ringa_lee2017-04-17 17:52:04

    이렇게 하면 메모리 누수가 발생하지만 충돌이 발생하는지 여부는 상황에 따라 다릅니다.
    예를 들어 특정 VC가 알림을 등록했지만 순환 참조로 인해 올바르게 공개되지 않았습니다. 그 후 알림이 다른 곳에 게시되면 VC는 해당 작업을 수행할 것입니다. 출시되면 충돌이 발생할 수 있습니다.
    libobjc.A.dylib objc_msgSend(sendMessage:)와 같은 오류를 찾는 것은 어렵습니다.

    Fabric을 사용해 보실 수 있습니다.

    회신하다
    0
  • 취소회신하다