過渡釋放
現象:當寫完和記憶體引用計數-1有關的操作後,程式馬上crash.
原因:空間被系統回收之後,不能再做和引用計數-1有關的操作,否則馬上crash
解決方式:删除
當引用計數為零時,系統會自己主動回收記憶體,我們僅僅管理引用計數.
野指針異常:
現象:可能會崩潰,也可能不會崩潰,寫到某一行代碼時突然崩潰.(沒有寫不論什麼和引用計數相關的代碼);
産生原因:該對象的空間已經被系統回收,不能訪問沒有全部權的對象.
解決方式:空間被系統回收以後,禁止訪問.
記憶體洩露:
現象:系統崩潰
産生原因:一直開辟空間,而不做空間回收處理.
解決方式:開辟空間的同一時候就要考慮空間的回收.
autorelease 會将聲明為autorelease的對象放入離它近期的自己主動釋放池中,當自己主動釋放池銷毀時,會向池中的每個對象發送給一個release消息.
面試題1
@autoreleasepool {
for (long i = 0; i < 100000000000; i++) {
@autoreleasepool{
Person *per = [[Person alloc]init];
[per autorelease];
}
}
}
存在的問題:沒有優化記憶體,反複開辟空間,卻沒有回收空間,會造成記憶體洩漏
面試題2
NSString *per = [[NSString alloc]init];//0 - 1
[per retain];//1 - 2
[per retain];//2 - 3
per = @"aa";
[per release];
存在的問題,指針變量重指向,造成記憶體洩漏,而且後面的空間回收操作無效.
記憶體管理基本原則:
假設你對一個對象進行了alloc,retain,copy之後,你就擁有了該對象的全部權,你就必須對它進行release或者autorelease.
當該引用對象計數為0時系統會自己主動調用dealloc方法來回收空間.該方法是由系統自己主動調用,不能手動調用.
驗證對象空間有沒有回收,僅僅要檢視該類的dealloc方法有沒有運作就可以.
記憶體管理經典分析:
遛狗原理和關燈原理