我在添加到視圖後檢查子視圖的retainCount。代碼:爲內存泄漏添加子視圖和釋放(retainCount)
- (void) loadView{
//...
toolbar = [[UIToolbar alloc] initWithFrame:nil];
[[self view] addSubView:toolbar];
}
- (void) dealloc{
NSLog(@"count=%d", [toolbar retainCount]); // count=2
[toolbar removeFromSuperView];
NSLog(@"count=%d", [toolbar retainCount]); // count=1
[toolbar release]
NSLog(@"count=%d", [toolbar retainCount]); // count=1
toolbar = nil;
NSLog(@"count=%d", [toolbar retainCount]); // count=0
}
從這個代碼中的dealloc {},我有一些問題:
1,工具欄的第一個日誌retainCount是2,因爲在init之後,工具欄,並添加到自視圖,該retaincount將變得2.
2,工具欄removeFromSuperView後,retainCount將變得1.
3,調用釋放方法的工具欄後,retainCount仍爲1,它不能成爲0.在我的選擇,因爲超級視圖仍然是工具欄(自我查看不是釋放),所以工具欄不能減少到0.
4,如果調用工具欄設置爲零,retainCount將爲0.此日誌是無用的。
我的問題是:
一)工具欄調用removeFromSuperView和發佈API,結果是一樣的,工具欄retainCount只會變得比1,所以如果我測試的代碼只使用他們每個人,結果是一樣的。那麼,我可以總結用戶只能調用每個API嗎?
b)從apple文檔中,子視圖被添加到自我視圖中,自視圖仍然是工具欄的句柄,所以在dealloc方法中,如果未調用viewDidUnload,工具欄的retainCount不能被縮小爲0.如果內存不足,系統將減少無用的視圖並調用viewDidUnload方法,它會自動將工具欄的retainCount減少爲0.因此,在dealloc方法中,我應該將工具欄設置爲nil。我很困惑,如果我把工具欄設置爲零,當viewDidUnload方法被調用時,工具欄將被縮小或不縮小?有沒有什麼漏洞?
Thx。
但是對於子視圖內存,當子視圖會被釋放釋放時,它應該只調用內存很低且在viewDidUnload方法中? – Golden
儀器測試內存泄漏。檢查這樣的保留計數將告訴你什麼。 – danielbeard
你不應該使用'retainCount':http://stackoverflow.com/questions/11028512/addsubview-and-dealloc-for-memory-leaks-retaincount#comment14420031_11028512 – rckoenes