使用系統的某些塊api(如UIView的塊版本寫動畫時),是否也考慮引用循環問題?
系統的某些塊API中,UIview的塊版本寫動畫時不需要考慮,但也有一些API需要考慮:
這些情況不需要考慮“引用循環”。
block的循環引用導致內存的泄露,ARC已經出來很久了,自動釋放內存的確很方便,但是并非絕對安全絕對不會產生內存泄露。導致iOS對象無法按預期釋放的一個無形殺手是——循環引用。循環引用可以簡單理解為A引用了B,而B又引用了A,雙方都同時保持對方的一個引用,導致任何時候引用計數都不為0,始終無法釋放。若當前對象是一個ViewController,則在dismiss或者pop之后其dealloc無法被調用,在頻繁的push或者present之后內存暴增,然后APP就掛了。下面列舉我們變成中比較容易碰到的三種循環引用的情形。
/////檢查內存泄露 ? 可以使用Xcode自帶的檢查內存泄露的工具(instruments):leaks.
Product ->Profile 打開一個面板后選擇leaks
當然有時候用這種檢查方法還是檢測不到內存泄露(檢查結果全是綠色)
我們可以使用另一種比較笨拙但有效的方法
- (void)viewDidAppear:(BOOL)animated {
[superviewDidAppear:animated];
NSLog(@"進入控制器:%@", [[selfclass]description]);
}
- (void)dealloc {
NSLog(@"控制器被dealloc: %@", [[selfclass]description]);
}
在被釋放的時候一定會調用dealloc里面的內容,如果不調用表示內存泄露,檢查一下代碼是否有循環引用現象。(可以寫一個Demo 測試一下)真的是這樣那,如果找到了循環引用的改成弱引用 當我改成弱引用的時候__weaktypeof(self)weakself =self;就會調用dealloc銷毀,阻止了內存泄漏。