iOS中copy和strong的异同
博客专区 > RainOrz 的博客 > 博客详情
iOS中copy和strong的异同
RainOrz 发表于2周前
iOS中copy和strong的异同
  • 发表于 2周前
  • 阅读 16
  • 收藏 0
  • 点赞 0
  • 评论 0

移动开发云端新模式探索实践 >>>   

摘要: copy和strong都是iOS常用的关键字,那么 他们有哪些相同和不同之处呢

首先我们声明以下变量

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

 

 

 

 

 

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 7
博文 73
码字总数 69345
×
RainOrz
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: