1.循環(huán)引用
常見于兩個VC相互引用尚蝌,通過@class解決鞋屈;
block 循環(huán)引用旺韭,通過__weak解決胶坠。
Use Weak References to Avoid Retain Cycles
2.發(fā)生異常時
使用@try{}@catch{},當(dāng)異常發(fā)生時叔壤,無法釋放對象瞎饲。
在ARC下,無法在@finally{}里邊調(diào)用release方法炼绘,只能通過添加編譯標(biāo)識:-fobjc-arc-exceptions嗅战,添加之后會產(chǎn)生大量額外代碼,一般情況不要開啟改標(biāo)識俺亮。如果你必須要開啟改標(biāo)識來保證不出現(xiàn)異常崩潰驮捍,那你應(yīng)該重新審視你自己的代碼,你的代碼肯定是有問題的脚曾。一般只有在這種情況下使用異常捕獲:如果不捕獲異常應(yīng)用就會終止东且。如果出現(xiàn)這種情況,應(yīng)用都終止了斟珊,還擔(dān)心啥內(nèi)存泄漏。而且富纸,這中情況將要發(fā)生時囤踩,也沒有一個合適的時機(jī)來添加代碼來使得異常變得安全。
3.CoreFoundation對象沒有調(diào)用CFRelease釋放
CoreFoundation里邊是純 C 的API晓褪,需要自己釋放堵漱。
4.heap(堆)上分配的內(nèi)存沒有調(diào)用free釋放
堆上分配的內(nèi)存需要自己手動釋放。
5.大次數(shù)循環(huán)時創(chuàng)建了很多臨時變量沒有釋放
Use Autorelease Pool Blocks to Reduce High-Memory Waterline
在循環(huán)內(nèi)部添加@autoreleasepool{/*...*/}涣仿。
6.數(shù)據(jù)庫勤庐、connection示惊、socket 用完沒有關(guān)閉,文件描述符(file descriptors)用完沒有釋放愉镰。
7.調(diào)試模式下開啟僵尸調(diào)試
NSZombieEnabled=“YES” (Enable Zombie Objects),開啟之后對象占用的內(nèi)存不會被釋放米罚。
8.定時器使用完沒有調(diào)用 invalidate 方法
如果NSTimer的target指向self,而該定時器賦給了該類的一個實(shí)例變量丈探,那么timer將引用當(dāng)前類录择,當(dāng)前類的實(shí)例變量又引用了timer,就造成了循環(huán)引用碗降。您可以授權(quán)其他對象來調(diào)用invalidate方法隘竭,但是什么時機(jī)調(diào)用您是不知道的。所以該循環(huán)引用其實(shí)無法很好地解決讼渊,不過您可以考慮給NSTimer添加一個類別动看,添加一個用block實(shí)現(xiàn)的定制方法。
@interface NSTimer (LLBlocksSupport)
+ (NSTimer *)ll_scheduledTimerWithInterval:(NSTimeInterval)interval
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?block:(void(^)())block
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?repeats:repeats;
@end
@implentation NSTimer (LLBlocksSupport)
+ (NSTimer *)ll_scheduledTimerWithInterval:(NSTimeInterval)interval
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? block:(void(^)())block
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? repeats:repeats
{
? ? ? ? return [self scheduledTimerWithInterval:interval
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?target:self
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? selector:@selector(ll_blockInvoke:)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?userInfo:[block copy]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? repeats:repeats];
}
+ (void)ll_blockInvoke:(NSTimer*)timer {
? ? ? ? void (^block)() = timer.userInfo;
? ? ? ? if (block) {
? ? ? ? ? ? ? ? block();
? ? ? ? }
}
@end
這樣爪幻,target是NSTimer自己菱皆,就不會導(dǎo)致循環(huán)引用了。
9.播放器使用完沒有調(diào)用 stop 方法
可用Xcode的Instruments里邊的Leaks檢測內(nèi)存泄漏笔咽。要用代碼檢測泄漏搔预,請 到這里。