这是一个面试常常会问到的题目,直接上代码说明。
首先谈谈NSMutableArray
@interface Person : NSObject
@property(copy)NSMutableArray *copyArray;
@property(strong)NSMutableArray *strongArray;
@end
Person *p = [[Person alloc] init];
//这种场景下只讨论赋值对象为NSMutableArray类型,因为赋值对象为NSArray类型时编译器会提示警告
NSMutableArray *mArray = [[NSMutableArray alloc] init];
p.strongArray = mArray;
[p.strongArray addObject:@"1"];//p.strongArray成功添加元素
p.copyArray = mArray;
[p.copyArray addObject:@"1"];//报错 -[__NSArray0 addObject:]: unrecognized selector sent to instance 0x1003029f0
报错的原因:
执行p.copyArray = mArray时,会调用setter方法,[mArray copy]深拷贝后会返回一个NSArray给p.copyArray,也就是说赋值操作后,p.copyArray变成了一个NSArray,我们知道,NSArray是不能进行增,删,改操作的,于是报错,注意这是运行后报错,编译期是没有错误或者警告提示的。
结论:
使用strong修饰NSMutableArray,但要注意,对p.strongArray进行增,删,改操作是同时也会影响到mArray,因为是浅拷贝。对于深浅拷贝不了解的可以看看另外一篇文章copy和mutableCopy的区别
接下来谈谈NSArray
@interface Person : NSObject
@property(copy)NSArray *copyArray;
@property(strong)NSArray *strongArray;
@end
Person *p = [[Person alloc] init];
//这种场景下只讨论赋值对象为NSMutableArray类型,因为赋值对象为NSArray类型时copy和strong没有区别
NSMutableArray *mArray = [[NSMutableArray alloc] init];
p.strongArray = mArray;
p.copyArray = mArray;
[mArray addObject:@"1"];
NSLog(@"%@,%@",p.strongArray,p.copyArray);
打印结果:
( 1 ),( )
结果分析:
p.strongArray = mArray执行的是浅拷贝,所以mArray改变了之后,p.strongArray也会改变,p.copyArray = mArray执行的是深拷贝,所以mArray改变了之后不会对p.copyArray产生影响。
结论:
使用copy或strong修饰NSArray都可以,为了安全起见,使用copy。