- 應(yīng)用中新創(chuàng)建的每個(gè)線程都有專用的椗且纾空間吞琐,線程的最大棧空間很小然爆,如果層級太深站粟,可能造成棧溢出。
- 每個(gè)進(jìn)程的所有線程共享同一個(gè)堆曾雕。
- 在相冊類 APP 中奴烙,如果所有的圖片都在 dataSource 中,這個(gè)數(shù)組將會(huì)很大,從而導(dǎo)致很高的峰值內(nèi)存使用切诀】罚可以固定數(shù)組的大小,在用戶滾動(dòng)視圖時(shí)換入或者換出圖片幅虑。
- A方法創(chuàng)建了一個(gè)對象并返回了a丰滑,B方法調(diào)用A方法,B內(nèi)引用a倒庵,那么不應(yīng)該在 B 中釋放 a褒墨,因?yàn)?B 方法中沒有創(chuàng)建實(shí)體對象,不要在 B 中使用 release. 當(dāng)創(chuàng)建一個(gè)對象并將其從非 alloc 方法返回時(shí)擎宝,應(yīng)使用 autorelease貌亭。這樣可以保證對象被釋放。
- (NSString *)address {
NSString *ad = [[[NSString alloc] initWithString:@"貝克街 221B"] autorelease];
return ad;
}
...
- (void)showPersonAddress:(Person *)p {
NSString *address = [p address];
NSLog(@"Person's Address: %@", address);
}
-
自己創(chuàng)建 autoreleasepool 塊的情況:
- 當(dāng)有一個(gè)創(chuàng)建了很多臨時(shí)對象的循環(huán)時(shí)认臊,在循環(huán)中使用 autoreleasepool 可以為每一次循環(huán)釋放內(nèi)存圃庭。循環(huán)次數(shù)多時(shí),對內(nèi)存的需求大大降低失晴。
- 自己創(chuàng)建的線程也應(yīng)創(chuàng)建一個(gè)自己的 autoreleasepool.
__weak
: 當(dāng)沒有強(qiáng)引用指向?qū)ο髸r(shí)剧腻,弱引用會(huì)被置為 nil.__unsafe__unretained
: 當(dāng)沒有強(qiáng)引用指向?qū)ο髸r(shí),弱引用不會(huì)被置為 nil.循環(huán)引用
雙向鏈表和環(huán)形鏈表中也存在循環(huán)引用涂屁。此時(shí)书在,一旦明確對象不會(huì)再被使用,需要編寫代碼打破鏈表的鏈接拆又。線程與計(jì)時(shí)器
- (void)startCountdown {
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateFeed:) userInfo:nil repeats:YES];
}
- (void)dealloc {
[self.timer invalidate];
}
很明顯上面的例子中產(chǎn)生了循環(huán)引用儒旬,直到 [self.timer invalidate] 執(zhí)行,timer 才會(huì)取消對 self 的強(qiáng)引用帖族,但是由于建立了循環(huán)引用栈源,這里的 dealloc 并不會(huì)調(diào)用,timer 并不會(huì)執(zhí)行 invalidate竖般。所以需要自定義一個(gè)清理的方法執(zhí)行清理操作甚垦。這樣的清理方法可以在離開當(dāng)前頁面點(diǎn)擊返回時(shí)調(diào)用。
另一種清理方案是將持有關(guān)系分散到多個(gè)類中——任務(wù)類執(zhí)行具體動(dòng)作涣雕,所有者類調(diào)用任務(wù)艰亮。類似于將 taget 設(shè)置為任務(wù)類的代理。
觀察者
鍵值觀察和通知中心不會(huì)維持觀察對象挣郭、被觀察對象以及上下文對象的強(qiáng)引用迄埃。如果要持續(xù)對一個(gè)對象進(jìn)行觀察,需要自行維護(hù)對它的強(qiáng)引用兑障。避免大量使用單例和全局狀態(tài)對象侄非。