ARC下記憶體洩露總結

2021-07-05 09:28:18 字數 1714 閱讀 7471

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...