认真探讨strong跟copy修饰的区别

曾同学写在前头 --> 码字不易,觉得有用写得不错的请点赞.觉得哪里有疑惑,请留下你的评论,咱们好好聊聊,多交流,技术更进一步哟~~~

关于strong & copy的区别:
通常问到该问题的,基本都是面试的时候遇到,自己本身开发或许不会考虑太多,但是对于一个有追求有理想的工程师,我们要好好理解它两的不同.

究两者之本质:不同的修饰符就是调用了不同的方法,其实就是set方法的不同
strong:指向_property地址.
setter方法-->[_property release]-->[_property retain]--> _property = property
copy:新建一个内存空间,用于存储_property的值.
setter方法-->[_property release]-->[property copy]-new一个内存地址->_property = property

翠花~ 上Code~~:
@property(strong, nonatomic) NSArray *strongArray;
@property(copy, nonatomic) NSArray *acopyArray;
NSMutableArray *array = [@[@"array_1"] mutableCopy];
self.strongArray = array;
self.acopyArray = array;
[array addObject: @"array_2"];
NSLog(@"second: strong: %@, copy: %@", self.strongArray, self.acopyArray);
NSLog(@"print-->p: strong: %p, copy: %p, array: %p", self.strongArray, self.acopyArray, array);
以上便是结合代码,通过结论去理解两者的不同(本人在早期学习时, 在网络上的引用)
把它们抽象成一张图,大家看了大概就明白了(临时作图, 下次搞个好点的工具)

97DF3490-DC36-4B7B-8B76-FBB5EC28ECBE.png

图片说明: 使用 strong 时(左),新建一个对象并赋值时, obj_跟 obj_cp 指针地址不同,但他们都指向同一块堆空间存放的 Obj,当其中一个对象修改Obj 的值时,另外一个对象再调用时,值就已经改变了. 使用 copy 时(右),同样新建对象该属性赋值时,两个属性的堆栈空间都已经独立了,相互间不影响,也就能保证数据安全咯.
小结:
strong在栈中的指针指向的是同一块内存地址,当对应的堆中的对象发生变化时,意味着该属性的值也随之变化;
copy在赋值之前,会创建一块新的栈空间存储内存地址,指向新的堆空间地址,并把值存储到该地址指向的控件中。

以上, 为二者区别. 了解区别有啥用?肯定得跟实践应用结合起来嘛, 所以以下为开发提供的一些建议.
当修饰 NSString/NSArray 等对象时,最好使用copy修饰。当然,具体还需要视项目需求来决定,建议使用 copy, 因为现在这点内存消耗,咱们还是耗得起的.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 江南自古多才子,江南的文化,是一种带有悲剧性格的贬官文化。而江南文化的性格,成为了江南才子笔下一种典型的文化性格。...
    槐安国阅读 4,525评论 2 1
  • 前言: 上次我们学习了多维尺度分析,这次我们学习对应分析,两者都是把复杂的数据关系,分解到二维或者多维空间上,简单...
    洛水青柳2017阅读 9,407评论 2 2
  • 2016-03-31 Dagger 2 and Base Classes — Generics and Prese...
    alighters阅读 1,670评论 0 1
  • 九月,已有初秋之意! 匆匆忙忙的走出门的时候,完全没有注意到秋季已经慢慢的走来了。有人说秋天是一个伤感的季节,也是...
    ZLYJFR阅读 1,501评论 0 1
  • 最近偶然读了些关于行为设计方面的东西,深觉心理学无处不在,无处不可应用。而行为设计作为一门不算新兴的新兴学科,早被...
    大青飞啊阅读 8,620评论 0 9