欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS @property中的NSString, NSArray, NSDictionary属性为什么大多时候用copy而不用strong的原因

程序员文章站 2022-05-16 10:17:40
ios @property中的nsstring, nsarray, nsdictionary属性为什么大多时候用copy而不用strong的原因。 一、代码实现数组赋值不用copy数据分析 #imp...

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:

iOS @property中的NSString, NSArray, NSDictionary属性为什么大多时候用copy而不用strong的原因