关于iOS开发中copy的使用

在iOS开发中我们在使用@property定义属性的时候经常会使用copy属性来个对一个NSString或者NSArray、NSDictionary来进行修饰,然而许多同学只是在别人的代码上看到,学习这样使用。
也有一部分同学是大概了解一点,主要是为了让该对象持有赋值对象的副本,避免被赋值对象在其他地方被修改,造成错误(我也是属于这一类。。),该文章主要是为了提升自己对copy属性的理解,并且区分什么时候使用才正确。

1.为什么要使用copy?

  • 因为父类指针可以指向子类对象,使用copy修饰对象的话,无论赋值对象是可变还是不可变的,对象本身持有的都是一个不可变的副本,这样就避免外界的影响。(其实这一个话是有点问题的,用copy修饰的对象如果传入一个不可变对象,其实也只是单纯的指针拷贝,指向的还是同一块内存,但是个人水平有限,对于内存问题不敢妄下定论)
  • 如果我们使用strong修饰对象的话,该对象可能会指向一个可变对象,如果这个可变对象发生改变的话,使用strong修饰的对象也会受到影响。

我们在日常使用NSString的时候,为了避免对象在某个地方被改变,而开发者也无法发现这种情况出现,我们经常都是使用copy修饰对象,这个时候即使传入一个“可变”对象,这个时候我们这个NSString 对象持有的只是该“可变”对象的一个“不可变”的副本。

2.在那些地方使用copy

首先这里要区分浅拷贝和深拷贝、集合对象和非集合对象

浅拷贝:一般理解为指针拷贝,就是会拷贝一个新的指针,但是指针指向的内存地址依然保持不变

深拷贝: 可以理解为内容拷贝,也就是说不仅会拷贝一份指针,同时对内容也会进行一次拷贝,相当于复制了一个副本

下面开始区分什么时候回进行浅拷贝,什么时候会进行深拷贝(按照集合类型和非集合类型讨论)

  • 对于非集合对象:
操作 结果
[不可变对象 copy] 浅拷贝
[不可变对象 mutableCopy] 深拷贝
[可变对象 copy] 深拷贝
[可变对象 mutableCopy] 深拷贝

就是说我们一般使用copy修饰一个NSString的时候,传入另外一个NSString的时候,只会复制一份新的指针,指向的还是同一个地址。但是由于传入的NSString是一个不可变对象,我们也不用担心它在其它地方被随意更改了。

@property(nonatomic,strong)NSString *strongString;

NSMutableString *mutString = [NSMutableString stringWithString:@"milan"];

self.strongString = [mutString copy];

类似以上操作,用Strong修饰的NSString对象所持有的也是一个"不可变"的副本

  • 对于集合类型对象:
操作 结果
[不可变对象 copy] 浅拷贝
[不可变对象 mutableCopy] 深拷贝
[可变对象 copy] 深拷贝
[可变对象 mutableCopy] 深拷贝

注意!对于集合类型的对象,内容拷贝的只有对象本身,对于集合类型内部的元素只进行浅拷贝,就是只拷贝指针

对于在什么地方使用Copy修饰对象,没有硬性要求,理解copy 以及mutableCopy以后,在何处使用自行判断就可以,当然为了避免自己很多时候考虑不周,我们一般建议使用copy修饰实例变量

3.使用copy的注意点

@property (nonatomic,copy)NSMutableArray *mutArray;

NSMutableArray *testArray = [NSMutableArray arrayWithObject:@"milan"];

self.mutArray = [testArray copy];

对于以上的操作在一般使用上是没有问题的,但是当你的mutArray想要插入或删除内容的时候会报错,因为[testArray copy]赋值给mutArray以后,其实它持有的是一个“不可变”的副本,即使你本身定义为一个可变对象。

最后

以上内容是参考别人的东西并加上自己的理解得出的,若有错误之处请指出,并且对于使用copy需要注意的地方,希望有更多的发现

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容