copy
@property (nonatomic, copy) NSArray *immutableArray;
當(dāng) property 使用 copy 來(lái)修飾時(shí)流译,在 setter 方法里會(huì)調(diào)用新值的 -copy 方法產(chǎn)生一個(gè)不可變的對(duì)象辛藻,再用這個(gè)對(duì)象進(jìn)行賦值。
于是就有了使用 copy 時(shí)要注意的點(diǎn):
- 必須遵守 NSCopying 協(xié)議苫纤;
- 一般用在不可變集合類上:
如:
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:@[@1, @2, @3]];
self.immutableArray = mutableArray;
[mutableArray removeAllObjects];
這時(shí)即使可變數(shù)組清空了所有對(duì)象碉钠,self.immutableArray 的內(nèi)容也不會(huì)改變,
因?yàn)榇藭r(shí)這兩個(gè)數(shù)組指向的已不是同一個(gè)對(duì)象卷拘,這就是 copy 的作用喊废。
此處換成 strong 就沒(méi)有這個(gè)效果了。
所以栗弟,使用 copy 能避免可變集合(如:mutableArray)給不可變集合(如:self.immutableArray)賦值時(shí)可能產(chǎn)生的錯(cuò)誤污筷,畢竟我們希望 self.immutableArray 的內(nèi)容能夠保持不變,而 mutableArray 在賦值完成后有可能會(huì)做一些內(nèi)容的更改乍赫,自然就不能讓他們指向同一個(gè)對(duì)象了瓣蛀。
再有陆蟆,直接通過(guò)該屬性對(duì)應(yīng)的實(shí)例變量來(lái)賦值的話,copy 是不起作用的:
_immutableArray = mutableArray; // 這時(shí)這兩個(gè)數(shù)組指向的仍然是同一個(gè)對(duì)象