應該用copy還是strong修飾NSArray或者NSMutableArray

這是一個面試常常會問到的題目,直接上代碼說明。

首先談談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。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容