淺談淺拷貝和深拷貝和字符串屬性copy修飾的原因

一赞弥、深拷貝和淺拷貝
在對象進(jìn)行copy操作的時候伐债。如果只復(fù)制了對象的指針,那么拷貝就屬于淺拷貝木羹。如果對對象的內(nèi)容進(jìn)行了拷貝甲雅。那么拷貝過程就屬于深拷貝了。下面分別對NSString汇跨、NSArray务荆、NSDictionary什么時候進(jìn)行淺拷貝什么時候進(jìn)行深拷貝進(jìn)行分析。
1.NSString:

    NSString *baseStr = @"默認(rèn)的字符串";
    NSString *copyStr = [baseStr copy];
    NSString *mutableCopyStr = [baseStr mutableCopy];
    NSLog(@"%p---%p---%p",baseStr,copyStr,mutableCopyStr);

控制臺輸出信息為


image.png

2.NSMutableString:

NSMutableString *mutableStr = [NSMutableString stringWithString:@"默認(rèn)的字符串"];
    NSString *baseStr = [mutableStr copy];
    NSMutableString *mutableBaseStr = [mutableStr mutableCopy];
    NSLog(@"%p---%p---%p",mutableStr,baseStr,mutableBaseStr);

控制臺輸出信息為


image.png

NSString結(jié)論:
通過分析可得對NSString進(jìn)行copy操作進(jìn)行的是淺拷貝穷遂、mutableCopy操作進(jìn)行的是深拷貝。
對于NSMutableString進(jìn)行的copy和mutableCopy都是深拷貝娱据。
3.NSArray

    NSArray *array = @[@"baseStr",@"baseStr2",@"baseStr3"];
    NSArray *copyArray = [array copy];
    NSArray *mutableCopy = [array mutableCopy];
    NSLog(@"%p---%p---%p",array,copyArray,mutableCopy);

控制臺輸出為


image.png

最終確認(rèn)NSArray和NSDictionary進(jìn)行copy
4.NSMutableArray

    NSMutableArray *mutableArray = [[NSMutableArray alloc]initWithArray:@[@"aaa",@"bbb",@"ccc"]];
    NSArray *copyArray = [mutableArray copy];
    NSArray *mutableCopy = [mutableArray mutableCopy];
    NSLog(@"%p---%p---%p",mutableArray,copyArray,mutableCopy);

控制臺輸出為


image.png

結(jié)論:經(jīng)驗(yàn)證NSString蚪黑、NSArray、NSDictionary進(jìn)行copy都是淺拷貝(指針拷貝)中剩、mutableCopy是深拷貝(內(nèi)存拷貝)
二:@property使用copy和strong的區(qū)別
property使用copy和strong的區(qū)別
我們以字符串的處理為例進(jìn)行講解
NSString的情況下進(jìn)行判斷
(1)使用copy的情況

@interface ViewController ()

@property (nonatomic, copy) NSString *defaultCopyString;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSMutableString *mutableString = [NSMutableString stringWithString:@"baseString"];
    self.defaultCopyString = mutableString;
    [mutableString appendString:@"123"];
    NSLog(@"%@",self.defaultCopyString);
}

控制臺輸出為
2018-01-30 14:39:28.283170+0800 PropertyCopyStrong[4378:559212] baseString
分析可得通過copy修飾的defaultCopyString字符串在進(jìn)行賦值的時候忌穿,是將可變字符串進(jìn)行了copy操作。對進(jìn)行了內(nèi)存的深拷貝结啼。重新占用了一塊內(nèi)存地址掠剑。所以當(dāng)對可變字符串進(jìn)行處理的時候〗祭ⅲ可以發(fā)現(xiàn)defaultCopyString并沒有發(fā)生改變朴译。
(2)使用strong修飾的情況

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, strong) NSString *defaultCopyString;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSMutableString *mutableString = [NSMutableString stringWithString:@"baseString"];
    self.defaultCopyString = mutableString;
    [mutableString appendString:@"123"];
    NSLog(@"%@",self.defaultCopyString);
}

控制臺輸出為:
2018-01-30 14:42:27.591001+0800 PropertyCopyStrong[4400:560825] baseString123
通過分析可得當(dāng)修飾符為strong的時候。并沒有進(jìn)行拷貝操作属铁。只是將可變字符串mutableString的引用計(jì)數(shù)進(jìn)行+1.內(nèi)存地址并沒有發(fā)生改變眠寿。當(dāng)對可變字符串進(jìn)行處理的時候defaultCopyString也同步發(fā)生了變化。
經(jīng)驗(yàn)證NSArray和NSDictionary具有跟NSString相同的特性焦蘑。如果涉及到可變數(shù)組和可變字典之間的相互轉(zhuǎn)換并且涉及到數(shù)組和字典的變化時盯拱。最好使用copy來修飾。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末例嘱,一起剝皮案震驚了整個濱河市狡逢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拼卵,老刑警劉巖奢浑,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異间学,居然都是意外死亡殷费,警方通過查閱死者的電腦和手機(jī)印荔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來详羡,“玉大人仍律,你說我怎么就攤上這事∈的” “怎么了水泉?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長窒盐。 經(jīng)常有香客問我草则,道長,這世上最難降的妖魔是什么蟹漓? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任炕横,我火速辦了婚禮,結(jié)果婚禮上葡粒,老公的妹妹穿的比我還像新娘份殿。我一直安慰自己,他們只是感情好嗽交,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布卿嘲。 她就那樣靜靜地躺著,像睡著了一般夫壁。 火紅的嫁衣襯著肌膚如雪拾枣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天盒让,我揣著相機(jī)與錄音梅肤,去河邊找鬼。 笑死糯彬,一個胖子當(dāng)著我的面吹牛凭语,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撩扒,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼似扔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了搓谆?” 一聲冷哼從身側(cè)響起炒辉,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泉手,沒想到半個月后黔寇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斩萌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年缝裤,在試婚紗的時候發(fā)現(xiàn)自己被綠了屏轰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡憋飞,死狀恐怖霎苗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情榛做,我是刑警寧澤唁盏,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站检眯,受9級特大地震影響厘擂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锰瘸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一刽严、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧避凝,春花似錦港庄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渤涌。三九已至佩谣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間实蓬,已是汗流浹背茸俭。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留安皱,地道東北人调鬓。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像酌伊,于是被迫代替她去往敵國和親腾窝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評論 2 359