一、深拷貝和淺拷貝
在對象進行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);
控制臺輸出信息為

2.NSMutableString:
NSMutableString *mutableStr = [NSMutableString stringWithString:@"默認的字符串"];
NSString *baseStr = [mutableStr copy];
NSMutableString *mutableBaseStr = [mutableStr mutableCopy];
NSLog(@"%p---%p---%p",mutableStr,baseStr,mutableBaseStr);
控制臺輸出信息為

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);
控制臺輸出為

最終確認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);
控制臺輸出為

結論:經(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來修飾。