相信现在在写OC @property 的时候特别是对 NSString, 都已经习惯的记住了使用 copy 关键字来进行修饰。 然后我看到有些代码里面对 NSDictionary NSArray等对象却依旧在使用 strong,来进行修饰。 我觉得既然 其对象被定义成了 UnMutableObject 我们在定义的时候,就应该想到在其应该是不可变的对象,如果我们违背了这个原则很容易就导致出现一些意想不到的问题。 先来看一段简单的示意代码。
@interface ViewController ()
@property (nonatomic, strong) NSArray *rankArray;
@end
@implementation
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSMutableArray* dataSour = [NSMutableArray arrayWithObjects:@"90",@"80",@"100",nil];
// 获取数据,进行展示。
self.rankArray = dataSour;
// 正常显示排行。
NSLog(@"%@",self.rankArray);
[dataSour addObject:@"25"];
// 说好的不可变数组呢? 为什么?突然冒出来了个 25?
NSLog(@"%@",self.strongName);
}
@end
上面这段小例子告诉我们,为什么在声明 不可变对象的时候,为什么要使用 Copy。而不是Strong。 由于其使用 Strong 导致其声明的时候原本是一个不可变数组,但是在 set 方法中由于没有使用 copy 来进行赋值。 导致自己已经隐形的变成了一个可变数组。 但是如果使用 Copy 来声明的话就不一样的 。 因为不管你源数据类型是可变不可变,进过 Copy 之后最终产物都是 不可变对象。 符合预期结果!!!!!
上面的代码写的很简单,当然我们开发中也不会犯这种错误, 这只是一个简单的比喻。 我们可以想象一下,假如这个是一个B同事开发的接口。 需要A同事需要调用这个接口 把 dataSource 传到 B同事的接口的时候, 如果 A 直接传入一个可变数组进来, 然后后面还修改了这段数据。 那么后面的问题可想而知了!!!!!