MRC
assign
MRC下assign是屬性默認的修飾符拾积,無論是簡單的數(shù)據(jù)類型殉挽,還是指向?qū)ο蟮闹羔槨?/p>
// 以下兩種寫法等價
@property (nonatomic) NSString *name;
@property (nonatomic, assign) NSString *name;
- assign 主要用于修飾非指針類型變量(一般的基礎(chǔ)數(shù)據(jù)丰涉,C數(shù)據(jù)類型)。比如 NSInteger斯碌,CGFloat一死,int,float傻唾,double摘符,char,等等策吠。
- assign 也可修飾對象(不建議)。當需要修飾對象類型時瘩绒,MRC時代使用unsafe_unretained猴抹。當然,unsafe_unretained也可能產(chǎn)生野指針锁荔,所以它名字是"unsafe_”蟀给。
- assign 修飾的屬性不持有對象,當其指向的對象在別處釋放后阳堕,該指針變?yōu)?strong>懸掛指針也叫野指針跋理。
unsafe_unretained
語義等同于 assign,一般用于修飾對象恬总,也可用于修飾數(shù)據(jù)類型前普。當目標對象遭到銷毀時,屬性值不會自動清空壹堰。產(chǎn)生野指針拭卿。
retain
修飾的屬性會持有它所指向的對象,對象的引用計數(shù) +1贱纠,當不再需要使用該對象時需調(diào)用 release 釋放峻厚。
copy
只能用于修飾對象屬性,將對象賦值給 copy 屬性時谆焊,一般情況下屬性會持有該對象的一份拷貝惠桃。
copy 分為深拷貝和淺拷貝。對于 Foundation 中含有可變版本的對象類型辖试,對其不可變版本的 copy 為淺拷貝辜王,對于可變對象的 copy 為深拷貝。
深拷貝與淺拷貝
從圖中我們可以了解到剃执,淺拷貝只是拷貝了指針誓禁,并未拷貝對象本身;而深拷貝則是指針和對象本身都進行了拷貝肾档。
- 淺拷貝:
- 深拷貝:
對于不可變對象而言摹恰,copy便是淺拷貝辫继,而mutableCopy是深拷貝。
對于可變對象而言俗慈,copy和mutableCopy都是深拷貝姑宽。但是copy出來的對象是不可變的,而mutableCopy則是可變對象闺阱。
ARC
assign/copy/retain
同 MRC 下的語義炮车。
strong
語義等同于 retain,體現(xiàn)了一種“擁有關(guān)系”酣溃。
設(shè)置新值時瘦穆,setter方法會先保留新值,并釋放舊值赊豌,然后再將新值設(shè)置上去扛或。
在ARC環(huán)境下,copy和strong類似碘饼。
weak
語義等同于unsafe_unretained熙兔,體現(xiàn)了一種“非擁有關(guān)系”。
weak 修飾符弱引用對象艾恼,不改變對象的引用計數(shù)住涉,當其指向的對象被銷毀時,它會自動的置為 nil钠绍。所以weak優(yōu)于unsafe_unretained舆声,不會發(fā)生野指針現(xiàn)象