object c 記憶體管理學習筆記

2021-06-09 01:55:17 字數 1682 閱讀 4004

nsautoreleasepool *pool =[[nsautoreleasepool alloc] init];

[pool drain]:這個函式可以把autoreleasepool裡的物件釋放

在for迴圈中每次都釋放記憶體池的示例:

nsautoreleasepool *temppool;

…for(i = 0; i

autoreleasepool儲存了實際物件的引用,當呼叫drain函式的時候將其釋放

將乙個物件放入autoreleasepool中:[myfraction autorelease];

每次呼叫retain方法,物件的引用計數就會加1

[myfraction retain]

當乙個物件被加入陣列裡,它的引用計數也會加1

當呼叫一次release函式後,該物件的引用計數會減1

[myfraction release]

當乙個物件引用計數為0的時候,系統就會呼叫該物件的dealloc訊息將其所占用的記憶體釋放掉

當呼叫乙個物件的retaincount訊息時候,該訊息會返回乙個nsuinteger型別的正整數,這個數字代表當前該物件的引用計數。

#import int main(int argc, const char * argv)

結果:myint retain count = 1

after adding to array = 2after asssignment to myint2 = 2myint after retain = 3

myint2 after retain = 3

after release = 2

after removal from array = 1

myint = [myarr obejctatindex:0]

...[myarr removeobjectatindex:0]

當陣列移除物件後,myint所指向的物件可能已經被**,**可能會崩潰

所以myint在獲得陣列物件的時候,還需要呼叫一次retain

int main(int argc, char *argv)

}結果:

retain count: mystr1: fffffffffffffff, mystr2: fffffffffffffff, mystr3: 1retain count: mystr1: fffffffffffffff, mystr2: fffffffffffffff, mystr3: 2retain count: mystr1: fffffffffffffff, mystr2: fffffffffffffff, mystr3: 3

因為str1,str2是使用常量字串初始化的,所以記憶體的分配和其他物件使用不一樣的機制。常量字串不會被release,所以它們使用引用計數機制,所以str1,str2列印的結構都是fffffffffff

當對乙個物件呼叫retain訊息的時候,在不用該物件的時候一定要記得呼叫其的release方法。通過copy,mutablecopy,alloc,new獲得的物件也需要在使用結束後呼叫release方法

在ios程式中,乙個事件迴圈會新建乙個新的autoreleasepool,並把之前的給drain掉,所以在這期間,任何沒有retain的記憶體池物件都會被銷毀。

記憶體管理學習筆記

1.棧 堆和靜態區 靜態區 儲存自動全域性變數和static變數 包括全域性靜態變數和區域性靜態變數 靜態區的內容在整個程式的生命週期內都存在。棧 儲存區域性變數。棧上的內容只在函式的範圍內存在,當函式執行結束,這些內容也會自動被銷毀。其特點是效率高,但是空間大小有限。堆 由malloc系列函式或n...

effectiveC 記憶體管理 學習筆記

1.盡量使用初始化列表而不要再建構函式裡賦值,初始化順序和宣告的順序一致,一些型別如const,引用等,必須使用初始化。對於非內部資料型別成員物件應當採用初始化表,以獲取更高的效率。example b b const a a m a a 只呼叫了類a的拷貝建構函式 2.基類都使用虛析構函式,這樣才能...

記憶體管理學習筆記1

背景 乙個人想要遛狗,中途可以換別的狗遛 所以首先得有乙個狗的類 dog 然後乙個 person類 裡有乙個dog的變數,自己過載setdog函式 synthsize dog dog void setdog dog adog if dog adog 先判斷要設定的狗是不是原來的狗,避免誤設定同一條狗...