總結:
可變變量中,copy是重新開辟一個內存,strong,weak,assgin后三者不開辟內存,只是指針指向原來保存值的內存的位置,storng指向后會對該內存引用計數+1,而weak,assgin不會。weak,assgin會在引用保存值的內存引用計數為0的時候值為空,并且weak會將內存值設為nil,assign不會,assign在內存沒有被重寫前依舊可以輸出,但一旦被重寫將出現奔潰
———————————————————
? 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;
——————— 分割線 ————————
iOS中assign,copy,retain之間的區別以及weak和strong的區別
發表于2014/12/28 13:26:59 17099人閱讀
分類: iOS
@property (nonatomic, assign) NSString *title;
什么是assign,copy,retain之間的區別?
assign: 簡單賦值,不更改索引計數(Reference Counting)。
copy: 建立一個索引計數為1的對象,然后釋放舊對象
retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1
weak 和strong的區別:
(weak和strong)不同的是 當一個對象不再有strong類型的指針指向它的時候 它會被釋放 ,即使還有weak型指針指向它。
一旦最后一個strong型指針離去 ,這個對象將被釋放,所有剩余的weak型指針都將被清除。
可能有個例子形容是妥當的。
想象我們的對象是一條狗,狗想要跑掉(被釋放)。
strong型指針就像是栓住的狗。只要你用牽繩掛住狗,狗就不會跑掉。如果有5個人牽著一條狗(5個strong型指針指向1個對象),除非5個牽繩都脫落 ,否著狗是不會跑掉的。
weak型指針就像是一個小孩指著狗喊到:“看!一只狗在那” 只要狗一直被栓著,小孩就能看到狗,(weak指針)會一直指向它。只要狗的牽繩脫落,狗就會跑掉,不管有多少小孩在看著它。
只要最后一個strong型指針不再指向對象,那么對象就會被釋放,同時所有的weak型指針都將會被清除。
使用assign: 對基礎數據類型 (NSInteger,CGFloat)和C數據類型(int, float, double, char, 等等)
使用copy: 對NSString
使用retain: 對其他NSObject和其子類
nonatomic關鍵字:
atomic是Objc使用的一種線程保護技術,基本上來講,是防止在寫未完成的時候被另外一個線程讀取,造成數據錯誤。而這種機制是耗費系統資源的,所以在iPhone這種小型設備上,如果沒有使用多線程間的通訊編程,那么nonatomic是一個非常好的選擇。