strong和copy的區(qū)別--針對可變字符串和不可變字符串

首先需要定義兩個屬性:stringCopy和stringStrong纯续。如下代碼:

@interface ViewController ()
@property (nonatomic, strong) NSString *stringStrong;
@property (nonatomic, copy) NSString *stringCopy;
@end

下面首先針對不可變字符串,strong和copy的區(qū)別:

首先創(chuàng)建一個變量tempString窗看,并且將tempString的值賦值給上面所聲明的兩個屬性倦炒,如下代碼:

    NSString *tempString = [NSString stringWithFormat:@"%@", @"hello, I am the original string"];
    _stringCopy = tempString;
    _stringStrong = tempString;
    
    NSLog(@"tempString:--- %@ %p", tempString,tempString);
    NSLog(@"self.stringCopy ----- %@ %p", self.stringCopy, self.stringCopy);
    NSLog(@"self.stringStrong ----- %@ %p", self.stringStrong, self.stringStrong);

打印結(jié)果如下:


image.png

可以看到不管是copy還是strong修飾的字符串,指向的都是同一個內(nèi)存地址构罗,證明該賦值操作只是指針拷貝智玻,并沒有拷貝其內(nèi)容。

想給大家看一個我很白癡的舉動吊奢,我在上面代碼打印log之后纹烹,去修改了tempString的值召边,代碼如下:

 tempString = @"sorry,I need change my words~";
NSLog(@"tempString:--- %@ %p", tempString,tempString); 
NSLog(@"self.stringCopy ----- %@ %p", self.stringCopy, self.stringCopy);
NSLog(@"self.stringStrong ----- %@ %p", self.stringStrong, self.stringStrong);

看到兩個屬性值和我預(yù)想的不一樣片挂,我在想既然是指針拷貝贞盯,那么修改了tempString的值后,兩個屬性值按理應(yīng)該是跟tempString保持一致的闷愤,但是打印的結(jié)果并不是件余,結(jié)果如下:


image.png

后來,我突然反應(yīng)過來啼器,我聲明的tempString是不可變字符串旬渠,在后面給其賦值其實是使tempStirng指向了新的內(nèi)存地址镀首,而兩個屬性變量還是指向原來的內(nèi)存地址,所以修改tempString的值后更哄,tempString的值變了,內(nèi)存地址也變了觅捆,而兩個屬性變量的值沒有改變麻敌。

眼尖的讀者會發(fā)現(xiàn)我上面賦值的時候用的是_stringCopy而不是self.stringCopy,之所以這么寫术羔,是因為我想驗證下這二者之間的區(qū)別,下面我會將_stringCopy換成self.stringCopy释移,然后再執(zhí)行一下程序寥殖,代碼如下:

    NSString *tempString = [NSString stringWithFormat:@"%@", @"hello, I am the original string"];
    self.stringCopy = tempString;
    self.stringStrong = tempString;
    
    NSLog(@"tempString:--- %@    %p", tempString,tempString);
    NSLog(@"self.stringCopy ----- %@    %p", self.stringCopy, self.stringCopy);
    NSLog(@"self.stringStrong ----- %@    %p", self.stringStrong, self.stringStrong);
    
    tempString = @"sorry,I need change my words~";
    NSLog(@"tempString:--- %@ %p", tempString,tempString);
    NSLog(@"self.stringCopy ----- %@ %p", self.stringCopy, self.stringCopy);
    NSLog(@"self.stringStrong ----- %@ %p", self.stringStrong, self.stringStrong);

打印結(jié)果如下:


image.png

大家可以發(fā)現(xiàn)對于不可變字符串,self.stringCopy和_stringCopy得出的結(jié)果是一樣的熏纯。

下面是針對可變字符串,strong和copy的區(qū)別误窖。

將上面的不可變字符串改成NSMutableString類型的變量往扔,代碼如下:

    NSMutableString *tempString = [NSMutableString stringWithFormat:@"%@", @"hello, I am the original string"];
    _stringCopy = tempString;
    _stringStrong = tempString;
    
    NSLog(@"tempString:--- %@    %p", tempString,tempString);
    NSLog(@"_stringCopy ----- %@    %p", self.stringCopy, self.stringCopy);
    NSLog(@"_stringStrong ----- %@    %p", self.stringStrong, self.stringStrong);
    NSLog(@"\n");
    [tempString setString:@"sorry,I need change my words~"];
    NSLog(@"tempString:--- %@    %p", tempString,tempString);
    NSLog(@"_stringCopy ----- %@    %p", _stringCopy, self.stringCopy);
    NSLog(@"_stringStrong ----- %@    %p", self.stringStrong, self.stringStrong);

打印結(jié)果如下:


image.png

可以看出修改可變字符串的值之前臨時變量和屬性變量的值和內(nèi)存地址是一致的蝗罗;修改可變字符串tempString的值之后蝌戒,屬性變量的值也跟著變了,并且和tempString的值是一致的北苟。

如若我將_stringCopy換成self.stringCopy后再重新執(zhí)行代碼后:

    NSMutableString *tempString = [NSMutableString stringWithFormat:@"%@", @"hello, I am the original string"];
    self.stringCopy = tempString;
    self.stringStrong = tempString;
    
    NSLog(@"tempString:--- %@    %p", tempString,tempString);
    NSLog(@"self.stringCopy ----- %@    %p", self.stringCopy, self.stringCopy);
    NSLog(@"self.stringStrong ----- %@    %p", self.stringStrong, self.stringStrong);
    NSLog(@"\n");
    [tempString setString:@"sorry,I need change my words~"];
    NSLog(@"tempString:--- %@    %p", tempString,tempString);
    NSLog(@"self.stringCopy ----- %@    %p", _stringCopy, self.stringCopy);
    NSLog(@"self.stringStrong ----- %@    %p", self.stringStrong, self.stringStrong);

執(zhí)行結(jié)果如下:


image.png

會發(fā)現(xiàn)友鼻,修改可變字符串tempString的值之后,strong修飾的屬性變量的值和tempString的值和內(nèi)存地址都是一致的妆档,但是copy修飾的屬性變量的值沒變虫碉,即還是tempString修改之前的值。大家可能會好奇敦捧,為啥只是換了一個使用方法,為啥結(jié)果會不一樣习瑰。其實是因為通過self點語法使用屬性時济蝉,會執(zhí)行屬性的setter方法菠发,而在setter中會執(zhí)行這么一個操作:

- (void)setTempString:(NSString *)tempString {
    tempString = [tempString copy]贺嫂;
    ///代碼塊...
}

所以對于可變字符串,如果通過下劃線_使用屬性糜俗,不會拷貝內(nèi)容,只是進行了指針拷貝曲饱;而如果是通過self點語法使用屬性變量,copy修飾的變量會拷貝內(nèi)容扩淀,從而生成新的內(nèi)存地址驻谆,但是strong修飾的變量只是進行了指針拷貝,沒有拷貝其內(nèi)容胜臊。

由上述一系列我們可以得出:
對于不可變字符串來說,不管是strong還是copy修飾的屬性變量黑忱,他們都是指向同一個對象的勒魔,即只是進行了淺拷貝(指針拷貝)。
對于可變字符串來說沥邻,strong只是進行引用計數(shù)加一的操作,并沒有對原字符串進行內(nèi)容拷貝埃跷,copy修飾的屬性變量對原字符串進行了一次深拷貝操作邮利,即執(zhí)行了內(nèi)容拷貝。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末延届,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子厕吉,更是在濱河造成了極大的恐慌,老刑警劉巖头朱,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件项钮,死亡現(xiàn)場離奇詭異,居然都是意外死亡烁巫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門磁餐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恃鞋,“玉大人,你說我怎么就攤上這事‰瓤” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵砂客,是天一觀的道長。 經(jīng)常有香客問我呵恢,道長鞠值,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任渗钉,我火速辦了婚禮彤恶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鳄橘。我一直安慰自己声离,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布瘫怜。 她就那樣靜靜地躺著术徊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赠涮。 梳的紋絲不亂的頭發(fā)上子寓,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天,我揣著相機與錄音笋除,去河邊找鬼别瞭。 笑死,一個胖子當(dāng)著我的面吹牛株憾,可吹牛的內(nèi)容都是我干的蝙寨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼嗤瞎,長吁一口氣:“原來是場噩夢啊……” “哼墙歪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贝奇,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤虹菲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后掉瞳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毕源,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年陕习,在試婚紗的時候發(fā)現(xiàn)自己被綠了霎褐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡该镣,死狀恐怖冻璃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情损合,我是刑警寧澤省艳,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站嫁审,受9級特大地震影響跋炕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜律适,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一辐烂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧擦耀,春花似錦棉圈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春德召,著一層夾襖步出監(jiān)牢的瞬間白魂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工上岗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留福荸,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓肴掷,卻偏偏與公主長得像敬锐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子呆瞻,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,492評論 2 348

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