iOS開發(fā)中用copy還是strong來修飾NSString

關(guān)于NSString要用Copy來修飾這個(gè)問題,我不多說只是擺出代碼:

Person * xiaoMing = [[Personalloc]init];
NSMutableString * name = [[NSMutableStringalloc]initWithString:@"xiaoming"];
xiaoMing.name = name;
NSLog(@"%@", xiaoMing.name);
[name appendString:@"hah"];
// 此時(shí)名字這個(gè)屬性被修改了
NSLog(@"%@", xiaoMing.name);

如果用Copy來修飾name這個(gè)屬性那么它不會(huì)隨著外部name的改變而改變,如果使用Strong,當(dāng)name這個(gè)字符串改變的時(shí)候,name這個(gè)屬性也會(huì)隨著改變(沒有生產(chǎn)一個(gè)新的對(duì)象,只是多了一個(gè)指針指向name)。

xiaoMing.name = name;(此時(shí)name是用copy修飾的) 等同于 xiaoMing.name = [name copy];(copy對(duì)可變對(duì)象進(jìn)行的是深拷貝,此時(shí)是拷貝出了一個(gè)新的對(duì)象然后賦值給了xiaoMing.name。mutableCopy對(duì)所有的對(duì)象進(jìn)行的都是深拷貝)

補(bǔ)充:如果我們希望被賦值的字符串隨著外部字符串的改變而改變,我們也完全可是使用strong來進(jìn)行修飾。

感覺上面寫的有點(diǎn)啰嗦。
當(dāng)用copy去修飾一個(gè)OC對(duì)象屬性后,系統(tǒng)為我們生成的set方法是這樣的:

  - (void)setName:(NSString *)name{
if (_name != name) {
    [_name release];
    _name = [name copy];
}
}

對(duì)外部傳進(jìn)來的字符串進(jìn)行了copy操作,當(dāng)外部傳入的是一個(gè)可變字符串的時(shí)候,為了保證拷貝的副本對(duì)象與源對(duì)象互不影響,此時(shí)的copy做的是一次深拷貝,所以用copy修飾字符串的時(shí)候,被修飾的字符串不會(huì)隨著賦值字符串的改變而改變。

總結(jié)!

1.copy是不能用來修飾可變對(duì)象的,如:NSMutableString、NSMutableArray、NSMutableDictionary。使用copy之后這些實(shí)例對(duì)象就變成了不可變對(duì)象,如果進(jìn)行增、刪、改的操作就會(huì)報(bào)錯(cuò)。
2.strong不適合用來修飾不可變對(duì)象,如:NSString、NSArray、NSDictionary。使用strong之后這些實(shí)例對(duì)象被賦值之后由于沒有生成新的對(duì)象,很可能隨著賦值對(duì)象的改變而改變。

  @property (nonatomic, strong) NSArray * array;

NSMutableArray * mutableArray = [NSMutableArray arrayWithArray:@[@"1", @"2"]];
self.array = mutableArray;
[mutableArray addObject:@"3"];

代碼中self.array會(huì)永遠(yuǎn)和mutableArray中的數(shù)據(jù)一樣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,668評(píng)論 1 32
  • 1.設(shè)計(jì)模式是什么? 你知道哪些設(shè)計(jì)模式,并簡(jiǎn)要敘述?設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn),就是用比較成熟的邏輯去處理某一種類型...
    龍飝閱讀 2,302評(píng)論 0 12
  • 這是去年參加完李欣頻2017年夢(mèng)想藍(lán)圖課寫的隨想,現(xiàn)在重新看依然覺得有所啟發(fā)。 今天參加完李欣頻廣州場(chǎng)的2017年...
    丹丹自語(yǔ)閱讀 166評(píng)論 0 0
  • 1、CSS選擇器常見的有幾種? 基礎(chǔ)選擇器 eg: 效果: 組合選擇器 eg: 效果: 屬性選擇器 eg: 效果:...
    _hello__world_閱讀 428評(píng)論 0 1
  • 上大學(xué)的時(shí)候,有人問我,你喜歡你的專業(yè)嗎?我會(huì)簡(jiǎn)單粗暴的告訴他,我一點(diǎn)不喜歡,這是我爸媽給我選的專業(yè)?;蛟S,這就話...
    snailwww閱讀 280評(píng)論 1 2

友情鏈接更多精彩內(nèi)容