美文网首页
应该用copy还是strong修饰NSArray或者NSMuta

应该用copy还是strong修饰NSArray或者NSMuta

作者: Remantou | 来源:发表于2017-02-05 16:16 被阅读0次

这是一个面试常常会问到的题目,直接上代码说明。

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

相关文章

网友评论

      本文标题:应该用copy还是strong修饰NSArray或者NSMuta

      本文链接:https://www.haomeiwen.com/subject/aqjeittx.html