文档章节

iOS中copy和strong的异同

RainOrz
 RainOrz
发布于 2018/05/10 11:02
字数 577
阅读 239
收藏 0
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依旧是只拷贝指针,浅拷贝

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
RainOrz
粉丝 8
博文 135
码字总数 89239
作品 0
青浦
程序员
私信 提问
2018 iOS 面试题大全(补充完整版)

原文地址:2018 iOS 面试题大全 由于原作者并没有继续更新,这里我转过来继续更新下 这个栏目将持续更新--请iOS的小伙伴关注! 1、iOS 应用导航模式有哪些? 2、iOS 中持久化方式有哪些? 3、...

Theendisthebegi
2018/11/15
0
0
iPhone开发之深入浅出 (2) — ARC之@property使用

上一回我们学到了一些ARC的基本概念,这一次我们来看看ARC对@property的使用规则有何影响。 所有者属性 我们先来看看与所有权有关系的属性,关键字间的对应关系。 属性值 关键字 所有权 stro...

小小贝
2012/12/24
0
0
iOS动画开发之五——炫酷的粒子效果

iOS动画开发之五——炫酷的粒子效果 在上几篇博客中,我们对UIView层的动画以及iOS的核心动画做了介绍,基本已经可以满足iOS应用项目中所有的动画需求,如果你觉得那些都还不够炫酷,亦或是你...

珲少
2015/07/29
0
1
Ionic 4 beta + Capacitor beta 尝鲜

本文为原创文章,转载请标明出处 开发环境: Ionic 4 beta 3、Capacitor beta 6。 首先 ,问是否集成 Cordova,选择 ,至此创建了一个空的 Ionic 4 项目,然后 到该工程目录下。 生成 目录。 ...

Metaphors
2018/08/18
0
0
Xcode ARC需要什么版本的环境支持

Mac OS X v10.6 和 v10.7 (64位应用) 的Xcode 4.2以上版本支持ARC,iOS 4 和 iOS 5 下ARC都能工作,但Weak不支持Mac OS X v10.6 和 iOS 4,所以要想在iOS 4下运行用ARC的程序,只能用strong。...

东方皓
2013/05/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Windows 上安装 Scala

在安装 Scala 之前需要先安装 Java 环境,具体安装的详细方法就不在这里描述了。 您可以自行搜索我们网站中的内容获得其他网站的帮助来获得如何安装 Java 环境的方法。 接下来,我们可以从 ...

honeymose
今天
1
0
数据库篇多表操作

第1章 多表操作 实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系...

stars永恒
今天
3
0
nginx日志自动切割

1.日志配置(Nginx 日志) access.log----记录哪些用户,哪些页面以及用户浏览器,IP等访问信息;error.log------记录服务器错误的日志 #配置日志存储路径:location / {      a...

em_aaron
昨天
5
0
java 反射

基本概念 RTTI,即Run-Time Type Identification,运行时类型识别。RTTI能在运行时就能够自动识别每个编译时已知的类型。   要想理解反射的原理,首先要了解什么是类型信息。Java让我们在运...

细节探索者
昨天
2
0
推荐转载连接

https://www.cnblogs.com/ysocean/p/7409779.html#_label0

小橙子的曼曼
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部