a有個屬性b,b有個屬性a,如果都是strong修飾的話,兩個物件都無法釋放。
這種問題常發生於把delegate宣告為strong屬性了。
例,
@inte***ce sampleviewcontroller
@property (nonatomic, strong) sampleclass *sampleclass;
@end
@inte***ce sampleclass
@property (nonatomic, strong) sampleviewcontroller *delegate;
@end
如果某個viewcontroller中有無限迴圈,也會導致即使viewcontroller對應的view關掉了,viewcontroller也不能被釋放。
這種問題常發生於animation處理。
例,比如,
catransition *transition = [catransition animation];
transition.duration = 0.5;
tansition.repeatcount = huge_vall;
[self.view.layer addanimation:transition forkey:"myanimation"];
上例中,animation重複次數設成huge_vall,乙個很大的數值,基本上等於無限迴圈了。
解決辦法是,在viewcontroller關掉的時候,停止這個animation。
[self.view.layer removeallanimations];}
因為當乙個物件存入到集合中的時候,缺省會儲存它的強指標,如果最後不對這個集合進行清空操作,一樣會有記憶體溢位的情況
person * p = [[person alloc] init];
nsmutablearray * arr = [[nsmutablearray alloc] init];
[arr addobject:p];
把物件從集合中移除的時候,也會釋放掉這個物件的強指標
[arr removeobject:p];
或者[arr removeallobjects];
而接下來才是重點:
arr = nil;//如果不進行賦值為nil的操作,一樣存在記憶體溢位的現象,賦值為nil系統會對其進行清空所有強指標的操作.
p = nil;
arc是自動檢測objc物件的,非objc物件就無能為力了,比如c或c++等。
c語言使用 malloc 開闢,free釋放。
c++使用new 開闢,delete釋放。
但是在arc下,不會新增非objc物件釋放語句,如果沒去釋放,也會造成記憶體洩露。
當你遷移乙個久工程到arc模式下, -fobjc-arc 編譯開關被預設的設定在所有的objective-c 源**上。 你可以使用-fno-objc-arc 來為特殊的class停用arc 。在xcode的 target的「build phases」標籤, 開啟compile sources group,展開源**列表, 雙擊你想要修改的源**的名字,再彈出框裡輸入-fno-objc-arc,然後點done按鈕。
但是,一旦你的程式中有arc和非arc這兩個class之間互動的時候,就會莫名的出現記憶體洩露!而且洩漏得莫名其妙……最終解決方案只能重寫其中乙個class以保證兩者均為arc或者非arc……
ARC中的記憶體洩露
arc機制中是否就不存在記憶體洩漏呢,答案是肯定的.有的人也許會說arc中怎麼會存在記憶體洩漏呢,它不是自動管理記憶體嗎?世事無絕對!因為當乙個物件存入到集合中的時候,缺省會儲存它的強指標,如果最後不對這個集合進行清空操作,一樣會有記憶體溢位的情況 person p person alloc ini...
記憶體洩露之自動記憶體管理 ARC
在xcode5.0之前都是手動記憶體管理的,但是在5.0之後就不需要程式猿管理了,為什麼呢?因為xcode會自動在我們需要釋放的地方加上release,這也是xcode的一項功能吧.這樣就能免去了我們對 的花太多的時間關心記憶體釋放的問題了,我們就可以專心的提高 實現某一項功能了.在arc模式下,系...
非ARC模式下記憶體管理總結
如果我們不使用arc來自動管理記憶體,那麼則應該記住以下準則 1.對於臨時物件 a.通過alloc new copy獲得的物件,應該在不再使用時釋放該物件 release b.通過其他任何方法獲得的物件,我們假設該物件的retaincount為1,且被設定為自動釋放物件,因此我們不需要做任何事情 2...