文档章节

iOS中copy和strong的异同

RainOrz
 RainOrz
发布于 05/10 11:02
字数 577
阅读 205
收藏 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
博文 123
码字总数 85815
作品 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
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
08/18
0
0
【iOS】定义@property时常用的修饰词介绍

iOS编程中,定义成员变量常用格式如下: 常用的修饰词有atomic,nonatomic,copy,assign,strong,weak,readonly,readwrite等。面试中也会常常被问到这些修饰词的含义及其之间的区别,其本...

浅浅青丘
06/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Shiro | 实现权限验证完整版

写在前面的话 提及权限,就会想到安全,是一个十分棘手的话题。这里只是作为学校Shiro的一个记录,而不是,权限就应该这样设计之类的。 Shiro框架 1、Shiro是基于Apache开源的强大灵活的开源...

冯文议
今天
1
0
linux 系统的运行级别

运行级别 运行级别 | 含义 0 关机 1 单用户模式,可以想象为windows 的安全模式,主要用于修复系统 2 不完全的命令模式,不含NFS服务 3 完全的命令行模式,就是标准的字符界面 4 系统保留 5 ...

Linux学习笔记
今天
2
0
学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
今天
3
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
15
0
GRASP设计模式

此文参考了这篇博客,建议读者阅读原文。 面向对象(Object-Oriented,OO)是当下软件开发的主流方法。在OO分析与设计中,我们首先从问题领域中抽象出领域模型,在领域模型中以适当的粒度归纳...

克虏伯
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部