這是一個面試常常會問到的題目,直接上代碼說明。
首先談談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。