dealloc不呼叫造成記憶體洩漏
前言
-
呼叫時機
- 蘋果官方文件
A class may provide a method definition for an instance method named
dealloc. This method will be called after the final release of the
object but before it is deallocated or any of its instance variables
are destroyed.
The superclass’s implementation of dealloc will be called automatically
when the method returns.
翻譯:
dealloc方法在最後一次release後被呼叫,但此時例項變數(Ivars)並未釋放,父類的dealloc的方法將在子類dealloc方法返回後自動呼叫,也就是說物件被銷燬後會呼叫dealloc方法
使用場景
重寫這個方法可以處理除了物件的例項變數之外的其他資源
釋放定時器
移除通知
-
移除代理 備註:***ARC下不能呼叫父類的dealloc方法 ***
- (void)dealloc { [self.timer invalidate] [[NSNotificationCenter defaultCenter]removeObserver:self]; }
原因彙總
-
block的迴圈引用問題(90%的比例)
block裡面使用了self.name或者_name
self.table.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
self.name = @"強引用屬性";
}];
//解決方案
__weak typeof(self) weakSelf = self;
self.table.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
weakSelf.name = @"強引用屬性";
}];-
block裡強引用了全域性變數
@implementation SomeViewControllefr
{
NSInteger page;
}
self.table.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
page+=1;//這裡模仿分頁載入場景
}];// 解決 把全域性變數宣告成屬性 @property (nonatomic,assign) NSInteger currentPage;
-
強引用代理
@property (nonatomic, strong) id<SomeDelegate> delegate;
-
NSTimer
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(someMethod) userInfo:nil repeats:YES]; [self.timer setFireDate:[NSDate dateNow]]; //解決 if (self.timer && [self.timer isValid]) { [self.timer invalidate]; self.timer = nil; // 不置為nil也行 };
後續
-
歡迎拍磚灌水,大家一起來討論不足。
-
轉載請註明出處:http://www.jianshu.com/p/2854b5b6bbf8
-
喜歡的看官給個紅心
-
推薦深度閱讀 OC原始碼 —— alloc, init, newdealloc http://www.jianshu.com/p/44f2ef4552a8
相關文章
- 閉包會造成記憶體洩漏嗎?記憶體
- 造成記憶體洩漏的操作有哪些?記憶體
- 造成記憶體洩漏的異常處理記憶體
- 避免使用Handler而造成的記憶體洩漏記憶體
- 記憶體洩漏記憶體
- Android中使用Handler為何造成記憶體洩漏?Android記憶體
- 分析記憶體洩漏和goroutine洩漏記憶體Go
- js記憶體洩漏JS記憶體
- Java記憶體洩漏Java記憶體
- webView 記憶體洩漏WebView記憶體
- Javascript記憶體洩漏JavaScript記憶體
- jvm 記憶體洩漏JVM記憶體
- 記憶體分析與記憶體洩漏定位記憶體
- 記憶體洩漏和記憶體溢位記憶體溢位
- valgrind 記憶體洩漏分析記憶體
- Android 記憶體洩漏Android記憶體
- Android記憶體洩漏Android記憶體
- 淺談記憶體洩漏記憶體
- 記憶體洩漏的原因記憶體
- JavaScript 記憶體洩漏教程JavaScript記憶體
- 說說 記憶體洩漏記憶體
- 【記憶體洩漏和記憶體溢位】JavaScript之深入淺出理解記憶體洩漏和記憶體溢位記憶體溢位JavaScript
- JVM——記憶體洩漏與記憶體溢位JVM記憶體溢位
- Perfdog 玩轉記憶體洩漏記憶體
- WebView引起的記憶體洩漏WebView記憶體
- .Net程式記憶體洩漏解析記憶體
- iOS檢測記憶體洩漏iOS記憶體
- Android 記憶體洩漏分析Android記憶體
- ARC下的記憶體洩漏記憶體
- PHP 記憶體洩漏分析定位PHP記憶體
- 如何檢測記憶體洩漏記憶體
- JavaScript之記憶體洩漏【四】JavaScript記憶體
- 【轉】Java的記憶體洩漏Java記憶體
- 如何查詢記憶體洩漏記憶體
- 記憶體洩漏除錯工具記憶體除錯
- 納尼,Java 存在記憶體洩洩洩洩洩洩漏嗎?Java記憶體
- JavaScript之記憶體溢位和記憶體洩漏JavaScript記憶體溢位
- 記憶體的分配與釋放,記憶體洩漏記憶體