検索

ホームページ  >  に質問  >  本文

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日前639

全員に返信(3)返信します

  • PHP中文网

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

    この 2 つにはいくつかの違いがあります。
    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:) のようなエラーを見つけるのは困難です。次のような他の情報があるかどうかを確認する必要があります。

    ファブリックを使ってみることができます。

    返事
    0
  • キャンセル返事