遇到 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 alloc] initWithtitle:returnHomeString clickedBlock:^(id sender) {
@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模式。 有的話關掉 。這兩個模式是衝突的。