前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >@property 关键字区别 - copy & mutableCopy

@property 关键字区别 - copy & mutableCopy

作者头像
小蠢驴打代码
发布2018-05-24 13:05:58
8270
发布2018-05-24 13:05:58
举报
文章被收录于专栏:小蠢驴iOS专题小蠢驴iOS专题

made in 小蠢驴的配图

       对于现在大部分iOS开发者来说,无论是在职的,打算跳槽的,或者还在找工作的,亦或还在培训中,将来可能面临找工作的(现在应该比较少了),面试都无疑是一座摆在面前无法逾越的大山了吧,因为确实很多面试问题,可能我们只是偶尔遇到,或者仅仅知道怎么用,但是却没有进行探究,接下来,我来讲一下,面试过程中几乎必问的 @property 关键字问题~

来自sunnyxx大神的面试题

对于数组,应该算是我们开发中最常见也是最常用的类型之一了,sunnyxx的这个题目,也确实可以考察出很多面试者的基础知识牢固程度;

如图,我们知道:

·array1 是 NSArray类型的,使用copy是正确的;

·array2 是 NSMutableArray类型的,使用strong 是正确的;

·array3 是 NSMutableArray类型的,使用了copy,可能会导致问题 -->系统认为他是mutable的,可以执行比如addObject 操作,可以写出addObject的方法,但是运行的时候会报错,可以理解为:NSMutable + copy = immutable(不可变);

·array0 的话,NSArray 使用 strong 可能很多人不知道会出现什么问题,甚至很多人可能这么用!其实这么用是有危险的,说的简单一点就是,strong 还是使用原来的内存地址,可能会使得本来的不可变数组变内容发生改变!


探究:NSArray 使用 strong 可能造成的问题!

使用strong 修饰 NSArray

运行结果如下:

NSArray 内容发生了改变

如图:我们发现,strongArray的本质是NSArray,是不可变的,仅在29行发生一次赋值的情况下,最后的结果竟然是变化的!

原理:strong -> 内存地址不变,还是指向本来那块内存,此时指向的是29行的arrayM,arrayM发生改变的时候,由于还是指向这块内存地址,我们的strongArray 虽然是 NSArray,却也跟着arrayM改变了

喜欢在NSArray上使用strong 修饰的朋友看过来了!!

使用copy 修饰 NSArray ,会copy一份新的内存地址,不会出现上述情况!(解决办法:strong 改 copy修饰,over)


华丽分割线

本文要讲的难道就是上面的 NSArray 使用 strong 的问题吗? nonono! 上述问题只是面试中可能遇到的,顺便带一下,本文的主要内容了:mutableCopy 和 copy 的关系;

简单的说,copy -> mutableCopy ==  NSarray + mutableCopy 约等于 NSMutableArray

But!!关键点来了:你遇到过NSMutableArray 添加对象的时候,失效的问题吗!


探索步骤如下:

第一步:创建一个可变数组,并给他赋值

为可变数组赋值

这里有人会说了,你可变数组怎么这么赋值的,你这里就出错了!

模拟网络请求 - 并赋值

那这种写法就常见了吧,而且没有⚠️,但是,其实这里这么写和上面的结果是一模一样的,这种大伙儿应该见的用的就多了吧


第二步:往数组中加入新数据

最常见错误

最常见错误出现了!在第一步赋值的时候,其实我们的mutableArray - - myArrayM已经变成不可变的了!所以这里本质是给一个不可变的数组(NSArray 添加对象)肯定报错


第三步:改第二步,使用mutableCopy实现 NSArray ->转 NSMutableArray

没有添加成功

关键问题来了!如图,没有报错,已经可以顺利执行addObject方法了,但是此时才是最可怕的,有执行,却没有加进去!


第四步:将可变的数组_myArrayM当成不可变的来用!

惊奇的发现:这样才能set成功


第5步:全程不给mutableArray赋值,只做add 操作

可变数组全程做add操作,不赋值

结果如下:

成功了!

终于实现了我们想要的效果:全程不对nsmutableArray赋值,仅做add操作!


问题所在:万恶的mutableCopy!

问题所在-mutableCopy

但凡使用了mutableCopy的!都无法成功添加对象进去!

原理:探究-->mutableCopy:

no1.测试mutableCopy 是否会改变数组的值

测试mutableCopy 是否会改变数组的值

如图,如图仅是使用mutableCopy,并不会影响到数组的内容


no2.为mutableCopy赋值

为mutableCopy赋值的数组进行操作

如图:内容发生了改变,但是改变的是arrayM.mutableCopy对象,而不是本身的arrayM对象 


no3.查看内存地址查明原因

查看内存地址

原因:我们发现内存地址不一样了!mutableCopy不止对内容进行了copy,还包括了指针,我们发现arrayM的地址,与 进行了 mutableCopy 的testArray的地址是不一样的!!

-->说明他们不是同一个对象了,所以我们在对 arrayM.mutableCopy 进行操作的时候,arrayM并不会受到影响,所以上面的arrayM.mutableCopy - addObject 方法执行完,改变的应该是arrayM.mutableCopy 之后的新对象,arrayM本身是不会受到影响的!

探究Demo:Demo

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.04.23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 探索步骤如下:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档