这一篇写的并不全面,只适用于非容器类型的,对于容器类型的拷贝,另当别论!
首先我们声明以下变量
@property (nonatomic,strong) NSArray *sary;
@property (nonatomic,copy) NSArray *cary;
@property (nonatomic,strong) NSMutableArray *sMuAry;
@property (nonatomic,copy) NSMutableArray *cMuAry;
首先初始化:
self.sary = @[@"1"];
self.cary = @[@"2"];
self.sMuAry = [NSMutableArray arrayWithArray:@[@"3"]];
self.cMuAry = [NSMutableArray arrayWithArray:@[@"4"]];
然后进行如下操作:
self.sary = self.sMuAry;
self.cary = self.sMuAry;
[self.sMuAry addObject:@"5"];
NSLog(@"%@,,%@,,%@",self.sary,self.cary,self.sMuAry);
NSLog(@"%p,,%p,,%p",self.sary,self.cary,self.sMuAry);
打印结果:
(3,5),,(3),,(3,5)
0x60400024b910,,0x604000017140,,0x60400024b910
由此我们可以得出结论:
1、strong修饰不可变类型的sary,并且使用sMuAry可变类型给sary赋值,再去修改可变类型sMuAry值的时候,sary所指向的值也会发生改变(浅拷贝) (3)-->(3,5)
2、copy修饰不可变类型的cary,并且使用sMuAry可变类型给cary赋值,再去修改可变类型sMuAry值的时候,cary所指向的值不会发生改变(深拷贝) (3)
我们在进行如下操作:
[self.cMuAry addObject:@"6"];
运行程序发现程序崩溃,信息如下:
-[__NSSingleObjectArrayI addObject:]: unrecognized selector sent to instance 0x60400000c870
2018-05-10 09:58:30.085995+0800 runloop[78679:2916787] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSSingleObjectArrayI addObject:]: unrecognized selector sent to instance 0x60400000c870'
由此我们得出结论:
copy修饰 系统会认为cMuAry是不可变数组 add时会崩溃 改为stong即可
接着我们进行如下操作:
NSArray *ary = @[@"11111"];
self.sary = ary;
self.cary = ary;
NSLog(@"%p..%p..%p",ary,self.sary,self.cary);
打印结果:0x604000014cf0..0x604000014cf0..0x604000014cf0
由此我们可以得出结论:
copy修饰不不可变类型(NSString,NSArray等)的时候,且使用不可边类型进行赋值,表示浅拷贝,只拷贝一份指针
strong此时和copy一样
然后我们在进行如下操作:
NSMutableArray *muary = [NSMutableArray arrayWithArray:@[@"12",@"34"]];
self.sMuAry = muary;
self.cMuAry = muary;
NSLog(@"%p..%p..%p",muary,self.sMuAry,self.cMuAry);
打印结果:0x600000253ce0..0x600000253ce0..0x600000220720
我们得出结论:
copy修饰的是可变类型(NSMutableArray,NSMutableString等)的时候,且使用可边类型进行赋值,表示深拷贝,直接拷贝新一份内容,到内存中,表示两份内容
strong依旧是只拷贝指针,浅拷贝