我們經(jīng)常在書寫代碼過程中使用到block蚕涤。
typedef <#returnType#>(^<#name#>)(<#arguments#>);
block是把雙刃劍筐赔,用的好了可以減少代碼書寫,使代碼簡單明了揖铜,用不好反而會照成循環(huán)引用(Retain Circle)茴丰,使內(nèi)存無法釋放,在書寫中難免會遇到這種問題天吓。那么我們怎么避免這種問題呢贿肩。
我在工作之余,寫了一個簡單的循環(huán)引用(Retain Circle)自動檢測的代碼失仁,原理也很簡單:定時掃描VC的parentViewController和presentingViewController尸曼,如果發(fā)現(xiàn)他們都為空,說明這個VC被系統(tǒng)釋放掉了萄焦,我們就檢查它釋放還存在控轿,如果還存在,說明它在其他地方被引用了拂封,這個時候就要懷疑是循環(huán)引用(Retain Circle)了茬射。
但是有一種情況特殊。
[UIApplication sharedApplication].delegate.window.rootViewController
當(dāng)這個恰好是自己的時候冒签,就要排除在外在抛。
當(dāng)然我們還有排除系統(tǒng)的VC,例如UIAlertView萧恕。
NSBundle *mainB = [NSBundle bundleForClass:[vc class]];
if (mainB == [NSBundle mainBundle]) {
vc.xy_exsit = YES;
[vc xy_startCheck];
}
這樣就可以了刚梭。用法詳見地址(github)
演示圖片