曾同学写在前头 --> 码字不易,觉得有用写得不错的请点赞.觉得哪里有疑惑,请留下你的评论,咱们好好聊聊,多交流,技术更进一步哟~~~
关于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);
以上便是结合代码,通过结论去理解两者的不同(本人在早期学习时, 在网络上的引用)
把它们抽象成一张图,大家看了大概就明白了(临时作图, 下次搞个好点的工具)
图片说明: 使用 strong 时(左),新建一个对象并赋值时, obj_跟 obj_cp 指针地址不同,但他们都指向同一块堆空间存放的 Obj,当其中一个对象修改Obj 的值时,另外一个对象再调用时,值就已经改变了. 使用 copy 时(右),同样新建对象该属性赋值时,两个属性的堆栈空间都已经独立了,相互间不影响,也就能保证数据安全咯.
小结:
strong在栈中的指针指向的是同一块内存地址,当对应的堆中的对象发生变化时,意味着该属性的值也随之变化;
copy在赋值之前,会创建一块新的栈空间存储内存地址,指向新的堆空间地址,并把值存储到该地址指向的控件中。
以上, 为二者区别. 了解区别有啥用?肯定得跟实践应用结合起来嘛, 所以以下为开发提供的一些建议.
当修饰 NSString/NSArray 等对象时,最好使用copy修饰。当然,具体还需要视项目需求来决定,建议使用 copy, 因为现在这点内存消耗,咱们还是耗得起的.