搜尋

首頁  >  問答  >  主體

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 天前638

全部回覆(3)我來回復

  • PHP中文网

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

    兩者有些差別。
    objc_msgSend (sendMessage:)是因為對釋放的物件呼叫方法。

    capturing self strongly in this block is likely to lead to a retain cycle
    會導致創建的物件無法釋放。
    例如每次進入一個 vc 時,都是新建立的。 vc裡面的block對self強引用了。
    這會導致這個 vc 無法釋放,每次進入都會創建新的vc,舊的vc也仍然存在。最後,應用程式會因為佔用記憶體過多被系統清理掉。

    回覆
    0
  • PHP中文网

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

    有可能,但是可能性不大,但是循環引用 肯定要去掉的。

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 17:52:04

    這會導致記憶體洩露,但是是否會導致崩潰要看情況。
    比如說,某個VC註冊了通知,但是由於循環引用,沒有得到正確釋放,而在這之後,別的地方post了這個通知,那麼,這個VC就會去執行相應操作,可能它所操作的東西已經被釋放了,那麼就可能會崩潰。
    對於你的libobjc.A.dylib objc_msgSend (sendMessage:)這樣的錯誤,是很難定位的,你應該看看是否還有其他信息,比如類似於這樣的:

    你可以試試使用Fabric.

    回覆
    0
  • 取消回覆