使用系統(tǒng)的某些塊api(如UIView的塊版本寫動畫時(shí))滞详,是否也考慮引用循環(huán)問題坛增?
系統(tǒng)的某些塊API中兰绣,UIview的塊版本寫動畫時(shí)不需要考慮搪柑,但也有一些API需要考慮:
這些情況不需要考慮“引用循環(huán)”聋丝。
block的循環(huán)引用導(dǎo)致內(nèi)存的泄露,ARC已經(jīng)出來很久了工碾,自動釋放內(nèi)存的確很方便弱睦,但是并非絕對安全絕對不會產(chǎn)生內(nèi)存泄露。導(dǎo)致iOS對象無法按預(yù)期釋放的一個(gè)無形殺手是——循環(huán)引用渊额。循環(huán)引用可以簡單理解為A引用了B况木,而B又引用了A,雙方都同時(shí)保持對方的一個(gè)引用旬迹,導(dǎo)致任何時(shí)候引用計(jì)數(shù)都不為0火惊,始終無法釋放。若當(dāng)前對象是一個(gè)ViewController奔垦,則在dismiss或者pop之后其dealloc無法被調(diào)用矗晃,在頻繁的push或者present之后內(nèi)存暴增,然后APP就掛了宴倍。下面列舉我們變成中比較容易碰到的三種循環(huán)引用的情形张症。
/////檢查內(nèi)存泄露 ? 可以使用Xcode自帶的檢查內(nèi)存泄露的工具(instruments):leaks.
Product ->Profile 打開一個(gè)面板后選擇leaks
當(dāng)然有時(shí)候用這種檢查方法還是檢測不到內(nèi)存泄露(檢查結(jié)果全是綠色)
我們可以使用另一種比較笨拙但有效的方法
- (void)viewDidAppear:(BOOL)animated {
[superviewDidAppear:animated];
NSLog(@"進(jìn)入控制器:%@", [[selfclass]description]);
}
- (void)dealloc {
NSLog(@"控制器被dealloc: %@", [[selfclass]description]);
}
在被釋放的時(shí)候一定會調(diào)用dealloc里面的內(nèi)容,如果不調(diào)用表示內(nèi)存泄露鸵贬,檢查一下代碼是否有循環(huán)引用現(xiàn)象俗他。(可以寫一個(gè)Demo 測試一下)真的是這樣那,如果找到了循環(huán)引用的改成弱引用 當(dāng)我改成弱引用的時(shí)候__weaktypeof(self)weakself =self;就會調(diào)用dealloc銷毀阔逼,阻止了內(nèi)存泄漏兆衅。