天天看點

Objective-C - retain release autorelease assign copy

http://examples.oreilly.com/9780596809775/ObjC.pdf

轉載位址:http://blog.csdn.net/jiarusun000/article/details/6991249

Objective-C - retain release autorelease

Objective-C在管理記憶體時,遵循一套簡單的規則。

每一個對象都有一個名為"retainCount"的變量,它表示該對象有多少個引用。

class *obj = [class alloc];//alloc會導緻retainCount為1

[obj retain];//retainCount++ 通常在對象指派之後這樣做,代表它多了一個引用。

[obj release];//retainCount-- 通常在使用完該對象的時候這樣做。
           

當 retainCount為0時,運作時環境會通過調用[obj dealloc]來釋放對象占用的記憶體。

下面 看一個例子:

Test *t1 = [[Test alloc] initWithNum:12];//建立了一個對象,t1是該對象的引用,由于調用了alloc此時retainCount為1
Test *t2 = t1;//此時t2也要使用該對象
[t2 retain];//t2要使用對象 就必須要retain,此時retainCount為2
[t1 release];//t1這時不用該對象了 就release了,也就是放棄了對象的使用權,此時retainCount為1
[t2 release];//t2使用完了 就release 此時retainCount為0,立刻會調用dealloc來釋放記憶體
           

其實,規則很簡單。誰使用誰就先retain,用完在release就可以了。這樣就不會記憶體洩露了。

oc中存在一個autorelease pool,其實它是一個NSMutableArray。

把對象加入到autorelease pool:

[obj autorelease];
           

autorelease在釋放的時候會給所有的對象發送release,如果該對象的retainCount為1,那麼結果導緻 retainCount為0,然後運作時就會調用對象的dealloc,以此來實作記憶體釋放。

如果你

[obj retain];

之後沒有

[obj release];

在autorelease pool 釋放的時候一樣會記憶體洩露!記住autorelease pool隻是給對象發送一次release而已!

轉載位址:http://blog.csdn.net/zhangao0086/article/details/6674460

Objective-C 屬性特性(assign , retain , copy , readonly , readwrite , atomic , nonatomic)

官方文檔位址:http://disanji.net/iOS_Doc/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html

assign:指定setter方法用簡單的指派,這是預設操作。你可以對标量類型(如int)使用這個屬性。你可以想象一個float,它不是一個對象,是以它不能retain、copy。

retain:指定retain應該在後面的對象上調用,前一個值發送一條release消息。你可以想象一個NSString執行個體,它是一個對象,而且你可能想要retain它。

copy:指定應該使用對象的副本(深度複制),前一個值發送一條release消息。基本上像retain,但是沒有增加引用計數,是配置設定一塊新的記憶體來放置它。

readonly:将隻生成getter方法而不生成setter方法(getter方法沒有get字首)。

readwrite:預設屬性,将生成不帶額外參數的getter和setter方法(setter方法隻有一個參數)。

atomic:對于對象的預設屬性,就是setter/getter生成的方法是一個原子操作。如果有多個線程同時調用setter的話,不會出現某一個線程執行setter全部語句之前,另一個線程開始執行setter的情況,相關于方法頭尾加了鎖一樣。

nonatomic:不保證setter/getter的原子性,多線程情況下資料可能會有問題。

object c 中 retain 和copy的差別

轉載位址:http://www.cnblogs.com/luyinghuai/archive/2011/01/27/1945948.html

原來簡單解釋過屬性定義(Property) ,并且提起了簡單的retain,copy,assign的差別。那究竟是有什麼差別呢? 

assign就不用說了,因為基本上是為簡單資料類型準備的,而不是NS對象們。 

Retain vs. Copy!! 

copy: 建立一個索引計數為1的對象,然後釋放舊對象 

retain:釋放舊的對象,将舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1 

那上面的是什麼該死的意思呢? 

Copy其實是建立了一個相同的對象,而retain不是: 

比如一個NSString對象,位址為0×1111,内容為@”STR” 

Copy到另外一個NSString之後,位址為0×2222,内容相同,新的對象retain為1,舊有對象沒有變化 

retain到另外一個NSString之後,位址相同(建立一個指針,指針拷貝),内容當然相同,這個對象的retain值+1 

也就是說,retain是指針拷貝,copy是内容拷貝。哇,比想象的簡單多了… 

mac

繼續閱讀