舉個例子:html
NSString *houseOfMM = [[NSString alloc] initWithString:'裝梵幾的三室兩廳']; ios
上面一段代碼會執行如下兩個動做:
1 在堆上分配一段內存用來存儲@' 裝梵幾的三室兩廳 ' ,好比:內存地址爲 0X1111 內容爲 ' 裝梵幾的三室兩廳' ,
2 在棧上分配一段內存用來存儲 houseForWife ,好比:地址爲 0XAAAA 內容天然爲 0X1111
下面分別看下(assign,retain,copy):
1.assign的狀況: NSString * myHouse = [ houseOfMM assign ];
此時 myHouse 和 houseOfMM 徹底相同,地址都是 0XAAAA ,內容爲 0X1111 ,即 myHouse 只是 houseOfMM 的別名,對任何一個操做就等於對另外一個操做。所以 retainCount 不須要增長.(同進同出,關係好,一把鑰匙,給我拿着)
2.retain的狀況: NSString * myHouse = [ houseOfMM retain ];
此時 myHouse 的地址再也不爲 0XAAAA ,可能爲 0XAABB ,可是內容依然爲 0X1111 .所以 myHouse 和 houseOfMM均可以管理' 裝梵幾的三室兩廳 '所在的內存。所以 retainCount 須要增長1.(有些獨立,各自進出,兩把鑰匙)
3.copy的狀況: NSString * myHouse = [ houseOfMM copy ]; app
此時會在堆上從新開闢一段內存存放@'裝梵幾的三室兩廳',好比0X1122,內容爲@'裝梵幾的三室兩廳',同時會在棧上爲myHouse分配空間,好比地址:0XAACC,內容爲0X1122,所以retainCount增長1供myHouse來管理0X1122這段內存.(兩套@'裝梵幾的三室兩廳',條件好,分居了,房子一人一套,因此鑰匙一人一把。) .net
何時用assign,固然是破房子,簡裝的房子拉
基礎類型(簡單類型,原子類型):NSInteger,CGPoint,CGFloat,C數據類型(int,float,double,char等)
何時用copy
含有可深拷貝的mutable子類的類,如NSArray,NSSet,NSDictionary,NSData的,NSCharacterSet,NSIndexSet,NSString
(可深度拷貝的房子)
可是NSMutableArray這樣的不能夠,Mutable的不能用copy,否則初始化會有問題。切記
何時用retain
其餘NSObject和其子類對象好嘛 (大多數)
ARC中的strong至關於非ARC中的retain,ARC來了之後多搞一把鑰匙就strong了啦。 翻譯
抄襲:http://wenku.baidu.com/view/ab6ed804bed5b9f3f90f1c7d.html 指針
有空的話翻譯一下好嘛: orm
http://clang.llvm.org/docs/AutomaticReferenceCounting.html htm
https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html 對象
http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html blog
先看這個 :
http://blog.csdn.net/favormm/article/details/7023322
http://www.crifan.com/object_c_property_setter_assign_retain_copy_weak_strong/
http://www.crifan.com/object_c_property_setter_assign_retain_copy_weak_strong/
來源:http://my.oschina.net/openlab/blog/89354
• copy: 用於但願保持一份傳入值的拷貝,而不是值自身的狀況,即把原來的對象完整的賦值到另一地方,從新加載一內存區,一個地方變了不影響另外一個地方的對象。
• assign: 簡單的直接賦值,至關於說兩個對象指向同個內存區,一個地方的變了,其餘的也跟着改變。
• retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提升輸入對象的索引計數 爲1
那上面的是什麼意思呢?
Copy 實際上是創建了一個相同的對象,而 retain 不是:
好比一個 NSString 對象,地址爲 0×1111,內容爲@」ABC」
Copy 到另一個 NSString 之 後,地址爲 0×2222,內容相同,新的對象 retain 爲 1, 舊 有對象沒有變化
retain 到另一個 NSString 之 後,地址相同(創建一個指針,指針拷貝),內容固然相 同,這個對象的 retain 值+1
assign 地址仍是0x1111,內容也仍是「ABC」。
也就是說,retain 是指針拷貝,copy 是內容拷貝。
strong,weak 用來修飾屬性。
strong 用來修飾強引用的屬性;
@property (strong) SomeClass * aObject;
對應原來的
@property (retain) SomeClass * aObject; 和 @property (copy) SomeClass * aObject; weak 用來修飾弱引用的屬性;@property (weak) SomeClass * aObject; 對應原來的 @property (assign) SomeClass * aObject;