NSString為什么要用copy關(guān)鍵字揩页,用strong會有什么問題旷偿?

文章轉(zhuǎn)自:

https://blog.csdn.net/huang512715681/article/details/73293357

我們大部分的時候NSString的屬性都是copy,那copy與strong的情況下到底有什么區(qū)別呢?我們以實例來說明:

@interfaceViewController()

@property(nonatomic,copy)NSString*str1;

@property(nonatomic,strong)NSString*str2;

@end

然后寫一個測試方法:

-(void)test{

NSMutableString*str=[NSMutableStringstringWithFormat:@"helloworld"];

self.str1=str;

self.str2=str;

NSLog(@"str:%p--%p",str,&str);

NSLog(@"copy_str:%p--%p",_str1,&_str1);

NSLog(@"strong_str:%p--%p",_str2,&_str2);

}

最后我們運行看打印結(jié)果:

2017-06-1515:21:55.910oa[1236:78490]str:0x600000075cc0--0x7fff5bd7c9d8

2017-06-1515:21:55.910oa[1236:78490]copy_str:0x600000026e60--0x7fc66cc06358

2017-06-1515:21:55.911oa[1236:78490]strong_str:0x600000075cc0--0x7fc66cc06360

從打印結(jié)果上我們可以看出str和_str2的對象地址是一樣的爆侣,指向同一個對象萍程,所以它們的值也是一樣的,而str和_str1對象地址不同兔仰,是兩個不同的對象茫负,所以copy是深復制,創(chuàng)建了一個新的對象乎赴。?

現(xiàn)在改變str的值忍法,看看str1和str2有什么變化:

[str appendString:@"hry"];

NSLog(@"****************%@",self.str1);

NSLog(@"****************%@",self.str2);

打印結(jié)果如下:

2017-06-15 15:21:55.911 oa[1236:78490]****************helloworld

2017-06-15 15:21:55.911 oa[1236:78490]****************helloworldhry

從打印結(jié)果可以看出經(jīng)過copy關(guān)鍵字修飾過的str1并沒有因為str的變化而變化,經(jīng)過strong修飾過的str2卻隨str的改變而改變榕吼。?

所以饿序,如果一般情況下,我們都不希望字串的值跟著str變化友题,所以我們一般用copy來設(shè)置string的屬性嗤堰。?

如果希望字串的值跟著賦值的字串的值變化,可以使用strong。

注意:上面的情況是針對于當把NSMutableString賦值給NSString的時候踢匣,才會有不同告匠,如果是賦值是NSString對象,那么使用copy還是strong离唬,結(jié)果都是一樣的后专,因為NSString對象根本就不能改變自身的值,他是不可變的输莺。

把一個對象賦值給一個屬性變量戚哎,當這個對象變化了,如果希望屬性變量變化就使用strong屬性嫂用,如果希望屬性變量不跟著變化型凳,就是用copy屬性。

由此可以看出:?

對源頭是NSMutableString的字符串嘱函,strong僅僅是指針引用甘畅,增加了引用計數(shù)器,這樣源頭改變的時候往弓,用這種strong方式聲明的變量(無論被賦值的變量是可變的還是不可變的)疏唾,它也會跟著改變;而copy聲明的變量,它不會跟著源頭改變函似,它實際上是深拷貝槐脏。

對源頭是NSString的字符串,無論是strong聲明的變量還是copy聲明的變量撇寞,當?shù)诙卧搭^的字符串重新指向其它的地方的時候顿天,它還是指向原來的最初的那個位置,也就是說其實二者都是指針引用重抖,也就是淺拷貝露氮。

另外說明一下,這兩者對內(nèi)存計數(shù)的影響都是一樣的钟沛,都會增加內(nèi)存引用計數(shù)畔规,都需要在最后的時候做處理。

其實說白了恨统,對字符串為啥要用這兩種方式叁扫?我覺得還是一個安全問題,比如聲明的一個NSString *mStr變量畜埋,然后把一個NSMutableString *str變量的賦值給它了莫绣,如果要求mStr跟著str變化,那么就用strong;如果mStr不能跟著str一起變化悠鞍,那就用copy对室。而對于要把NSString類型的字符串賦值給mStr,那兩都沒啥區(qū)別。不會影響安全性掩宜,內(nèi)存管理也一樣蔫骂。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市牺汤,隨后出現(xiàn)的幾起案子辽旋,更是在濱河造成了極大的恐慌,老刑警劉巖檐迟,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件补胚,死亡現(xiàn)場離奇詭異,居然都是意外死亡追迟,警方通過查閱死者的電腦和手機溶其,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敦间,“玉大人握联,你說我怎么就攤上這事∶柯鳎” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵纯露,是天一觀的道長剿骨。 經(jīng)常有香客問我,道長埠褪,這世上最難降的妖魔是什么浓利? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮钞速,結(jié)果婚禮上贷掖,老公的妹妹穿的比我還像新娘。我一直安慰自己渴语,他們只是感情好苹威,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驾凶,像睡著了一般牙甫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上调违,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天窟哺,我揣著相機與錄音,去河邊找鬼技肩。 笑死且轨,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旋奢,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼泳挥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了黄绩?” 一聲冷哼從身側(cè)響起羡洁,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎爽丹,沒想到半個月后筑煮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡粤蝎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年真仲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片初澎。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡秸应,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碑宴,到底是詐尸還是另有隱情软啼,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布延柠,位于F島的核電站祸挪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贞间。R本人自食惡果不足惜贿条,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望增热。 院中可真熱鬧整以,春花似錦、人聲如沸峻仇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽础浮。三九已至帆调,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間豆同,已是汗流浹背番刊。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留影锈,地道東北人芹务。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓蝉绷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親枣抱。 傳聞我的和親對象是個殘疾皇子熔吗,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容