這是一個面試常常會問到的題目,直接上代碼說明蒸播。
首先談?wù)凬SMutableArray
@interface Person : NSObject
@property(copy)NSMutableArray *copyArray;
@property(strong)NSMutableArray *strongArray;
@end
Person *p = [[Person alloc] init];
//這種場景下只討論賦值對象為NSMutableArray類型,因?yàn)橘x值對象為NSArray類型時(shí)編譯器會提示警告
NSMutableArray *mArray = [[NSMutableArray alloc] init];
p.strongArray = mArray;
[p.strongArray addObject:@"1"];//p.strongArray成功添加元素
p.copyArray = mArray;
[p.copyArray addObject:@"1"];//報(bào)錯 -[__NSArray0 addObject:]: unrecognized selector sent to instance 0x1003029f0
報(bào)錯的原因:
執(zhí)行p.copyArray = mArray時(shí),會調(diào)用setter方法卜壕,[mArray copy]深拷貝后會返回一個NSArray給p.copyArray,也就是說賦值操作后,p.copyArray變成了一個NSArray烙常,我們知道轴捎,NSArray是不能進(jìn)行增,刪,改操作的侦副,于是報(bào)錯侦锯,注意這是運(yùn)行后報(bào)錯,編譯期是沒有錯誤或者警告提示的秦驯。
結(jié)論:
使用strong修飾NSMutableArray,但要注意率触,對p.strongArray進(jìn)行增,刪汇竭,改操作是同時(shí)也會影響到mArray,因?yàn)槭菧\拷貝穴张。對于深淺拷貝不了解的可以看看另外一篇文章copy和mutableCopy的區(qū)別
接下來談?wù)凬SArray
@interface Person : NSObject
@property(copy)NSArray *copyArray;
@property(strong)NSArray *strongArray;
@end
Person *p = [[Person alloc] init];
//這種場景下只討論賦值對象為NSMutableArray類型细燎,因?yàn)橘x值對象為NSArray類型時(shí)copy和strong沒有區(qū)別
NSMutableArray *mArray = [[NSMutableArray alloc] init];
p.strongArray = mArray;
p.copyArray = mArray;
[mArray addObject:@"1"];
NSLog(@"%@,%@",p.strongArray,p.copyArray);
打印結(jié)果:
( 1 ),( )
結(jié)果分析:
p.strongArray = mArray執(zhí)行的是淺拷貝,所以mArray改變了之后皂甘,p.strongArray也會改變玻驻,p.copyArray = mArray執(zhí)行的是深拷貝,所以mArray改變了之后不會對p.copyArray產(chǎn)生影響偿枕。
結(jié)論:
使用copy或strong修飾NSArray都可以璧瞬,為了安全起見,使用copy渐夸。