通過copy獲取的物件是指標複製,其對應的retaincount會加1,即需要對其進行release。
mutablecopy是內容複製,產生一塊新的位址存放,所以用 mutablecopy所產生的要分別使用不同的物件進行release:例如:
nsmutablestring *str = [str1 mutablecopy];
//這裡需要對str 使用release,str1 要release
[str release];
[str1 release];
nsstring *str2 = [str3 copy];
//這裡對str3和str2釋放,可以連續釋放str2(3) 2次,或者str2 1次 str3 1次
[str2 release];
[str2 release];
今天在使用nsuserdefaults時,發現乙個記憶體管理的問題。由於nsuserdefaults是乙個單例物件,在其中加入了乙個dic (dictionary)過後。每次通過nsuserdefaults *userdefaults = [nsuserdefaults standarduserdefaults];
獲得物件的時候dic的retaincount都會自動加1,如果這時對dic進行release會報記憶體問題的錯誤。後來了解知道單例物件不需要進行記憶體管理,在程式執行結束後,單例銷毀,對應的dic也被**。
記憶體管理中的autorelease延遲減1,要在釋放池結束後才釋放。
@autoreleasepool {}
或者
nsautoreleasepool *pool = [[nsautoreleasepool alloc] init];
/*需要釋放的內容
*/[pool release];
常量的引用計數為正無窮,stringwithstring initwithstring 類似 @」1」其引用計數也是正無窮。
如果乙個物件a中如果有需要管理記憶體的物件b,那麼就需要在a的dealloc方法中對物件b進行release如圖:
其中要呼叫[super dealloc];
如果物件a 中引用了 物件b,物件b 中需要引用物件a,那麼為了避免迴圈引用,乙個類中用@import , 乙個類中使用@class,而且在記憶體釋放的時候,要對乙個物件賦值為nil,否者記憶體都不會進行釋放。
乙個物件放入集合中時,其引用計數會加1,在集合被release的時候,集合中的所有物件都會進行release,引用計數減1。
oc的記憶體管理
記憶體管理在oc中是非常重要的,如果乙個專案記憶體沒有管理好,那麼整個專案已經是沒有用了。所以記憶體管理是非常重要的。那麼為什麼要進行記憶體管理呢?由於移動裝置的記憶體極其有限,所以每個 所佔的記憶體也是有限制的,當 所占用的記憶體較多時,系統就會發出記憶體警告,這時需要 一些不需要再繼續使用的記憶...
OC的記憶體管理
程式在執行的過程中通常通過以下行為,來增加程式的的記憶體占用。每個軟體所能占用的記憶體也是有限的當程式所占用的記憶體較多時,系統就會發出記憶體警告,這時就得 一些不需要再使用的記憶體空間。比如 一些不需要使用的物件 變數等如果程式占用記憶體過大,系統可能會強制關閉程式,造成程式崩潰 閃退現象,影響使...
Oc 記憶體管理
1 對你自己擁有的物件負責,你只能釋放你擁有的物件 2 凡是你通過 retain alloc copy等手段獲得了所有者的物件,都必須在你不使用的時候來呼叫release autorelease等手段來釋放對他的所有權 3 在一定的 段內,對同乙個物件所作的copy alloc retain的操作次...