iOS @property中的NSString, NSArray, NSDictionary属性为什么大多时候用copy而不用strong的原因
ios @property中的nsstring, nsarray, nsdictionary属性为什么大多时候用copy而不用strong的原因。
一、代码实现数组赋值不用copy数据分析
#import "viewcontroller.h"
@interface viewcontroller ()
@property (nonatomic,strong)nsarray *array;//全局不可变数组
@end
@implementation viewcontroller
- (void)viewdidload {
[super viewdidload];
nsmutablearray *marray = [nsmutablearrayarray];
[marray addobject:@"shihu"];
self.array = marray;
[marray addobject:@"zhangying"];
nslog(@"self.array --->%@ ,marray --> %@",self.array,marray);
}
提问:大家猜猜控制器会输出什么数据???
打印结果:
2017-09-10 12:19:28.300找bug~demo[74440:1165432] self.array --->(
shihu,
zhangying
) ,marray --> (
shihu,
zhangying
)
原因很简单, 因为objective-c支持多态.
所以表面上self.array是nsarray对象, 其实骨子里是nsmutablearray对象.这样的话将会对后期debug增加很大的成本, 可能会导致莫名其妙的错误.
二、用copy数据分析
- (void)viewdidload {
[super viewdidload];
nsmutablearray *marray = [nsmutablearrayarray];
[marray addobject:@"shihu"];
//self.array = marray;
self.array = [marraycopy];//浅拷贝一次
[marray addobject:@"zhangying"];
nslog(@"self.array --->%@ ,marray --> %@",self.array,marray);
}
提问:大家猜猜控制器会输出什么数据???
打印结果:
2017-09-10 12:25:27.720 找bug~demo[74493:1169444] self.array --->(
shihu
) ,marray --> (
shihu,
zhangying
)
结论:这样就能保证不管赋值的是可变还是不可变数组, nsarray就是nsarray了
三、补充图表更加理解copy与mutablecopy的区别:
图1:
上一篇: C语言代码评审小结
下一篇: PS怎么设计扁平化的箭头图标?