點選頁面1上的按鈕跳到頁面2,此時記憶體增加5兆,然後點選頁面2上的按鈕dismiss頁面2,這時執行了頁面2的dealloc方法,但是那5兆記憶體卻沒有釋放。為什麼? ARC則下的記憶體不是及時釋放? 我們應該怎麼判斷一個視圖控制器或物件是否真正的釋放?
註:記憶體使用情況我是透過Xcode的debug session來看的。
在類別中加入以下程式碼,透過看dismiss的時候是否有該類別的log來判斷這個類別的釋放情況:
#pragma mark - dealloc -(void)dealloc { NSLog(@"dealloc %@", NSStringFromClass([self class])); }
例如類別名稱MyViewController, 如果釋放成功的話會有dealloc MyViewController的log。 然後再調試,找出到底是什麼造成的。
MyViewController
dealloc MyViewController
可能情況:
在某個地方strong引用了該類
strong
在block中直接使用self(應該使用__weak typeof(self) weakSelf = self,然後在block中使用weakSelf)🎟
block
self
__weak typeof(self) weakSelf = self
weakSelf
控制器重寫-(void)dealloc方法, 在控制器dismiss或是pop時看該方法有沒有呼叫.
-(void)dealloc
用analyze分析App記憶體
如果是xcode 8.0版本以上的可以查看記憶體圖.
在類別中加入以下程式碼,透過看dismiss的時候是否有該類別的log來判斷這個類別的釋放情況:
例如類別名稱
MyViewController
, 如果釋放成功的話會有dealloc MyViewController
的log。然後再調試,找出到底是什麼造成的。
可能情況:
在某個地方
strong
引用了該類在
block
中直接使用self
(應該使用__weak typeof(self) weakSelf = self
,然後在block中使用weakSelf
)🎟控制器重寫
-(void)dealloc
方法, 在控制器dismiss或是pop時看該方法有沒有呼叫.用analyze分析App記憶體
如果是xcode 8.0版本以上的可以查看記憶體圖.