iOS-NSString strong copy mutableCopy

聊一聊NSString的strong copy mutableCopy。

簡(jiǎn)單概括一下深拷貝和淺拷貝。

淺拷貝:

指針拷貝,復(fù)制一個(gè)新的指針,只想同一塊內(nèi)存區(qū)域。實(shí)際內(nèi)存并沒(méi)有發(fā)生拷貝

深拷貝:

內(nèi)容拷貝,拷貝數(shù)據(jù)到一塊新內(nèi)存區(qū)域,指針指向拷貝的數(shù)據(jù)區(qū)

先定義兩個(gè)NSString屬性

@property (nonatomic, strong) NSString *strongString;
@property (nonatomic, copy) NSString *copyedString;

一個(gè)用strong,一個(gè)用copy。

不可變字符串賦值

NSString *string = @"hui";
self.strongString = string;
self.copyedString = string;

NSLog(@"%p, %p, %p", string, self.strongString, self.copyedString);

打印地址的結(jié)果:

0x10e93b078, 0x10e93b078, 0x10e93b078

可見(jiàn),不管是strong還是copy屬性的對(duì)象,將不可變的字符串賦值給它們,它們都執(zhí)行的是淺拷貝。

所以它們都指向了同一個(gè)地址。

可變字符串賦值

NSMutableString *mutableString = [NSMutableString stringWithString:@"hui"];
self.strongString = mutableString;
self.copyedString = mutableString;

NSLog(@"%p, %p, %p", mutableString, self.strongString, self.copyedString);

打印地址的結(jié)果:

0x600003866700, 0x600003866700, 0x89853a7b95263aa8

從打印結(jié)果中可以發(fā)現(xiàn),strong修飾的字符串(strongString)與mutableString指向了同一個(gè)地址,但是copy修飾的字符串(copyedString)指向了另外一個(gè)地址。因?yàn)閳?zhí)行了深拷貝。

不可變字符串調(diào)用mutableCopy

NSString *string = @"hui";
[[string mutableCopy] appendFormat:@"_li"];
//    [[string copy] appendString:@"_li"];  這句話執(zhí)行會(huì)報(bào)錯(cuò),因?yàn)閏opy后,拷貝出來(lái)的是一個(gè)不可變字符串
NSLog(@"%p, %p", string, [string mutableCopy]);

打印結(jié)果:

0x10ee70078, 0x6000037cec40

通過(guò)打印結(jié)果,可以得到,不可變字符串調(diào)用mutableCopy執(zhí)行了深拷貝,拷貝出來(lái)的是一個(gè)可變的字符串。

可變字符串調(diào)用mutableCopy

NSMutableString *mutableString = [NSMutableString stringWithString:@"hui"];
[[mutableString mutableCopy] appendFormat:@"_li"];
//    [[mutableString copy] appendString:@"_li"];  //這句話執(zhí)行會(huì)報(bào)錯(cuò),因?yàn)閏opy后,拷貝出來(lái)的是一個(gè)不可變字符串
NSLog(@"%p, %p", mutableString, [mutableString mutableCopy]);

打印結(jié)果:

0x6000000916b0, 0x6000000c4b40

通過(guò)打印結(jié)果,可以得到,可變字符串調(diào)用mutableCopy執(zhí)行了深拷貝,拷貝出來(lái)的是一個(gè)可變的字符串。

總結(jié):

1. strong出來(lái)的字符串,執(zhí)行的是淺拷貝;
2. copy出來(lái)的字符串一定是不可變的字符串。傳入的字符串如果不可變,那么執(zhí)行的就是淺拷貝;如果是可變,那么執(zhí)行的就是深拷貝;
3. mutableCopy出來(lái)的字符串一定是可變的字符串,無(wú)論傳入的字符串可變與否,都是執(zhí)行深拷貝;

over!

?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,674評(píng)論 1 32
  • NSString 和 NSArray 在@property的時(shí)候,到底是用strong還是用copy修飾,這里依據(jù)...
    林大鵬閱讀 3,461評(píng)論 5 7
  • 拷貝:顧名思義就是將一個(gè)對(duì)象復(fù)制一份出來(lái)。說(shuō)到iOS中得拷貝操作,大概用的最多的應(yīng)該就是數(shù)組的拷貝操作。如果自己的...
    嚤仌啾啾閱讀 1,748評(píng)論 2 25
  • 開(kāi)發(fā)中,數(shù)據(jù)處理是整個(gè)項(xiàng)目的重中之重,清晰的數(shù)據(jù)結(jié)構(gòu),安全高效的處理流程,能大大提高開(kāi)發(fā)效率和系統(tǒng)的穩(wěn)定性。數(shù)據(jù)是...
    擇勢(shì)量投閱讀 1,060評(píng)論 0 5
  • 簡(jiǎn)述深淺拷貝 我們實(shí)例化的對(duì)象存儲(chǔ)在堆區(qū),而指向?qū)ο蟮闹羔樢话愦鎯?chǔ)在棧區(qū)。我們需要知道這個(gè)前提。??實(shí)際上拷貝分為...
    朽木自雕也閱讀 644評(píng)論 1 3

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