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

一、深拷貝和淺拷貝
在對象進行copy操作的時候。如果只復制了對象的指針,那么拷貝就屬于淺拷貝。如果對對象的內(nèi)容進行了拷貝。那么拷貝過程就屬于深拷貝了。下面分別對NSString、NSArray、NSDictionary什么時候進行淺拷貝什么時候進行深拷貝進行分析。
1.NSString:

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

控制臺輸出信息為


image.png

2.NSMutableString:

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

控制臺輸出信息為


image.png

NSString結論:
通過分析可得對NSString進行copy操作進行的是淺拷貝、mutableCopy操作進行的是深拷貝。
對于NSMutableString進行的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

最終確認NSArray和NSDictionary進行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

結論:經(jīng)驗證NSString、NSArray、NSDictionary進行copy都是淺拷貝(指針拷貝)、mutableCopy是深拷貝(內(nèi)存拷貝)
二:@property使用copy和strong的區(qū)別
property使用copy和strong的區(qū)別
我們以字符串的處理為例進行講解
NSString的情況下進行判斷
(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字符串在進行賦值的時候,是將可變字符串進行了copy操作。對進行了內(nèi)存的深拷貝。重新占用了一塊內(nèi)存地址。所以當對可變字符串進行處理的時候??梢园l(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
通過分析可得當修飾符為strong的時候。并沒有進行拷貝操作。只是將可變字符串mutableString的引用計數(shù)進行+1.內(nèi)存地址并沒有發(fā)生改變。當對可變字符串進行處理的時候defaultCopyString也同步發(fā)生了變化。
經(jīng)驗證NSArray和NSDictionary具有跟NSString相同的特性。如果涉及到可變數(shù)組和可變字典之間的相互轉(zhuǎn)換并且涉及到數(shù)組和字典的變化時。最好使用copy來修飾。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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