NSString的Copy與Strong你用對了嗎斗锭?

NSString我們必不可少的類,但是在你@property的時候,到底是用Strong失球,還是Copy修飾岖是。你用對了嗎?

用例子來說明一下
先使用NSString
@property (nonatomic, strong) NSString *strongStr;
@property (nonatomic,   copy) NSString *copyedStr;
//不可以寫成copyStr會報property follows cocoa naming convention for returning 'owned' objects
//意思是不能使用copy來作為開頭命名实苞,copy是cocoa用的

這里聲明了兩個NSString變量豺撑,一個用strong修飾,另一個用copy來修飾黔牵,下面我們來用一個NSString對兩個string賦值聪轿。

輸出查看一下結果
    NSString *testStr = [NSString stringWithFormat:@"nanshanyi"];
    self.strongStr = testStr;
    self.copyedStr = testStr;
    
    NSLog(@"testStr:   %p, %p",testStr,&testStr);
    NSLog(@"strongStr: %p, %p",_strongStr,&_strongStr);
    NSLog(@"copyedStr: %p, %p",_copyedStr,&_copyedStr);
//前面的是內存地址,后面的是指針地址
testStr:   0xa01c06542cac2d0a, 0x16fdb1f48
strongStr: 0xa01c06542cac2d0a, 0x1346e6030
copyedStr: 0xa01c06542cac2d0a, 0x1346e6038

根據輸出的內存地址猾浦,我們發(fā)現陆错,不管用的是strong還是copy灯抛,指向的都是同一個地址,也就是testStr的地址音瓷。strongStr和copyedStr都只是對testStr的引用对嚼,只會導致testStr的計數器加1,并沒有拷貝一份新的绳慎,testStr的retainCount應該是3纵竖。

下面我們改用NSMutableString
    NSMutableString *testStr = [NSMutableString stringWithFormat:@"nanshanyi"];
    self.strongStr = testStr;
    self.copyedStr = testStr;
    
    NSLog(@"testStr:   %p, %p",testStr,&testStr);
    NSLog(@"strongStr: %p, %p",_strongStr,&_strongStr);
    NSLog(@"copyedStr: %p, %p",_copyedStr,&_copyedStr);

    [testStr appendString:@"123"];//修改一下
    NSLog(@"testStr:   %@, %p",testStr,&testStr);
    NSLog(@"strongStr: %@, %p",_strongStr,&_strongStr);
    NSLog(@"copyedStr: %@, %p",_copyedStr,&_copyedStr);

我們再來看一下結果:

testStr:   0x15cdf87f0, 0x16fd99f48
strongStr: 0x15cdf87f0, 0x15cdf3ad0
copyedStr: 0xa0b20b31520b9419, 0x15cdf3ad8
//修改后輸出一下字符串內容
testStr:   nanshanyi123, 0x16fd99f48
strongStr: nanshanyi123, 0x15cdf3ad0
copyedStr: nanshanyi, 0x15cdf3ad8

可以看到這個時候,copy修飾的copyedStr字符串偷线,已經不再是簡單的引用了磨确,而是拷貝了一個新的,讓copyedStr指向了這個新的地址声邦。此時testStr的retainCount應該是2乏奥。
  然后我們把testStr修改一下,后面接上了“123”亥曹,輸出內容會發(fā)現testStr變化后邓了,strongStr會隨之改變。而copyStr則不會隨之變化媳瞪。

總結

由上面的例子可以得出:當原字符串是NSString時骗炉,由于是不可變字符串,所以蛇受,不管是使用strong還是copy修飾句葵,都是指向原來的對象,copy操作只是做了次淺拷貝兢仰。
  而當源字符串是NSMutableString時乍丈,strong只是將原字符串的引用計數加1,而copy
則是對原字符串做了次深拷貝把将,從而生成了一個新的對象轻专,并且copy的對象指向這個新的對象。另外需要注意的是察蹲,這個copy屬性對象的類型始終是NSString请垛,而不是NSMutableString,如果想讓拷貝過來的對象是可變的洽议,就需要使mutableCopy宗收。
  所以,如果原字符串是NSMutableString的時候亚兄,使用strong只會增加引用計數器混稽。但是copy會執(zhí)行一次深拷貝,會造成不必要的內存浪費。而如果原字符串是NSString時荚坞,copy和strong效果一樣,就不會有這個問題菲盾。
  但是颓影,一般我們聲明NSString時,也不會希望它改變懒鉴,所以一般情況下诡挂,建議用copy,這樣可以避免NSMutableString帶來的奇葩錯誤临谱。

順便提一下assign與weak

我們都知道璃俗,assign用來修飾基本數據類型,weak用來修飾OC對象悉默。
  其實照理說assign也可以用來修飾對象城豁。但是assign修飾的對象在此對象釋放的時候,指針地址依然存在抄课,不會被置為nil唱星,這就會造成很嚴重的問題,也就是會產生野指針跟磨。但是用weak來修飾的話在對象釋放的時候會把指針置為nil间聊,從而避免野指針的出現。
  那你又會問了抵拘,那憑啥基本數據類型就可以使用assign哎榴。這個就又要扯到堆和棧的問題了,基本數據類型一般是被分配到椊┲耄空間尚蝌。而棧是由系統(tǒng)自動管理分配和釋放。就不會造成野指針的問題墩瞳。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末驼壶,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子喉酌,更是在濱河造成了極大的恐慌热凹,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泪电,死亡現場離奇詭異般妙,居然都是意外死亡,警方通過查閱死者的電腦和手機相速,發(fā)現死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門碟渺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人突诬,你說我怎么就攤上這事苫拍∥叻保” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵绒极,是天一觀的道長骏令。 經常有香客問我,道長垄提,這世上最難降的妖魔是什么榔袋? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮铡俐,結果婚禮上凰兑,老公的妹妹穿的比我還像新娘。我一直安慰自己审丘,他們只是感情好吏够,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著备恤,像睡著了一般稿饰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上露泊,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天喉镰,我揣著相機與錄音,去河邊找鬼惭笑。 笑死侣姆,一個胖子當著我的面吹牛,可吹牛的內容都是我干的沉噩。 我是一名探鬼主播捺宗,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼川蒙!你這毒婦竟也來了蚜厉?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤畜眨,失蹤者是張志新(化名)和其女友劉穎昼牛,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體康聂,經...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡贰健,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了恬汁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伶椿。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出脊另,到底是詐尸還是另有隱情导狡,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布偎痛,位于F島的核電站烘豌,受9級特大地震影響,放射性物質發(fā)生泄漏看彼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一囚聚、第九天 我趴在偏房一處隱蔽的房頂上張望靖榕。 院中可真熱鬧,春花似錦顽铸、人聲如沸茁计。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽星压。三九已至,卻和暖如春鬼譬,著一層夾襖步出監(jiān)牢的瞬間娜膘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工优质, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留竣贪,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓巩螃,卻偏偏與公主長得像演怎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子避乏,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容