關於delloc 沒有調用 問題排查 筆記

遇到 delloc 沒有調用 基本上就可以斷定是循環引用造成的了。

而遇到這種情況基本上可以分爲  

1: 屬性聲明weak的地方 寫成了 strong  ,比如delegate。

2: block語法塊中 存在的強引用。

所以遇到delloc 基本上排查下這兩種情況 就能解決80%的問題了。 

但是現實中往往會有遇到一些其他的問題所在 ,比如 我今天遇到的一個viewcontroller  一直沒有釋放,全局搜索了這個文件裏面 所有用到的 delegate 以及self.  和_XX 屬性 結果 發現都沒問題。  可以返回上一級頁面 此viewcontroller 卻一直沒有調用。 後來發現這個問題出在父類的身上。

僞代碼如下



@implementation BaseViewController ()

- (id)init

{

    self = [super init];

    if (self) {

         self.back = [[CustomItem allocinitWithtitle:returnHomeString clickedBlock:^(id sender) {

  [super goBack];
      }];
}

@end


@interface ViewControllerA : BaseViewController

- (id)init

{

    self = [super init];

    if (self) {

           }

}


@end



ViewControllerA 一直沒有釋放,當時在ViewControllerA 搜尋了半天也沒查出是哪裏問題來,後來往父類去 看 結果發現了這樣的代碼。當時也是醉了。



遇到這種情況 其實有兩種修改方式 


A 直接將   [super goBack];  提取出來  封裝成另外一個函數 比如 goBackFunc,然後在block 中再利用weakSelf 去調用goBackFunc

B 利用反射機制取到父類

 BaseViewController *strongSelf = weakSelf;

if(strongSelf){

struct objc_super superSelf = { strongSelf, [BaseViewController superclass] };

                objc_msgSendSuper(&superSelf, @selector(goBack));

}

這樣子  直接在block塊中替換代碼可以用不另外封裝函數。



PS  關於Instruments 的 Allocations  也有一個陷阱 ,當發現你寫的代碼 已經調用了delloc, 但是顯示的Persistent 值並沒有減少一直增加時  檢查下是否之前打開過zombie模式。 有的話關掉  。這兩個模式是衝突的。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章