iOS中copy和strong的异同

这一篇写的并不全面,只适用于非容器类型的,对于容器类型的拷贝,另当别论!

首先我们声明以下变量

@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依旧是只拷贝指针,浅拷贝

 

110038_hiTd_2429434.png

 

 

 

 

 

转载于:https://my.oschina.net/rainwz/blog/1810036

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值