iOS 學習筆記 記憶體管理 1 自動引用計數

2021-07-29 06:09:51 字數 1849 閱讀 6285

辦公室照明問題:

在辦公室照明裝置只有乙個情況下,a進入辦公室,開燈(生成物件),需要照明(持有物件),b進入辦公室,需要照明(持有物件),當b離開辦公室,即不需要照明時(釋放物件),由於a還在需要照明,故燈還是開啟狀態,當a也離開辦公室,辦公室內沒有人需要照明(釋放物件),則燈關閉(廢棄物件);

故所以,引用計數相當於這裡的需要照明人的個數,需要照明則retain,不需要照明則release,當人數=0時,物件自然廢棄(dealloc)

其中,記憶體管理有以下幾種思考方式

1.自己生成的物件,自己持有
使用以下名稱開頭的方法名,意味著自己生成物件且自己持有:
包含上面字首的方法也一位置自己生成物件且自己持有:

但對於以下名稱,即使使用alloc,new,copy,mutablecopy開頭,但不屬於同一類別方法

/**

自己生成並持有物件

*/id obj = [[nsobject alloc]init];

其中copy方法基於nscopying協議,由各類實現copywithzone:方法生成並持有物件。同樣mutablecopy方法基於nsmutablecopying協議,由各類實現copywithzone:方法生成並持有物件。用這些方法生成的物件雖然是副本,但同alloc,new一樣,在自己生成自己持有這點上並沒有區別。

2.非自己生成的物件,自己也能持有
使用非上面所敘述的 alloc/new/copy/mutablecopy方法所取得的物件,則是非自己生成,但自己持有

//取得非自己生成,但持有的物件

id obj = [nsarray array];

//自己持有 retain

[obj retain];

3.不再需要自己持有的物件時釋放
主要是弄清release與autorelease的區別

//自己生成並持有

id obj = [[nsobject alloc]init];

//釋放

[obj release];

//自己生成並持有

id obj = [[nsobject alloc]init];

//取得物件存在 但自己不持有物件

4.無法釋放非自己持有的物件

//自己生成並持有物件

id obj = [[nsobject alloc]init];

//obj 釋放 自己不再持有

[obj release];

//崩潰 釋放之後再次釋放已非自己持有物件

[obj release];

更多底層alloc,copy等底層實現檢視 《objective-c高階程式設計 ios與os

x多執行緒和記憶體管理》,本文內容大多撰自此書

ios學習筆記之記憶體管理

一,記憶體管理型別定義 1,基本型別 任何c的型別,eg int,short,char,long,long long,struct,enum,union等屬於基本型別或結構體 記憶體管理對於c語言的基本型別無效 2,oc型別 非基本型別 任何繼承於nsobject類的物件都屬於oc型別 也就是除了c...

黑馬IOS學習總結1 記憶體管理

1 基本理論 alloc new mutable copy 這三者會使計數器 1 retain 返回其呼叫的物件本身 示例 person p person alloc init retaincount 為1 p是在棧記憶體中,其內儲存著指向堆記憶體中開創出來的person物件位址的值。p retai...

IOS 學習筆記14 記憶體管理(2)記憶體管理策略

文章中帶有lpstudy的字樣表明是我個人的理解,可能會有不對的地方,敬請指教。html view plain copy 記憶體管理策略 在引用計數機制下,你可以採用nsobject protocol的方法和和標準的方法命名約定進行記憶體管理。nsobject也定義了乙個dealloc方法,它在物件...