[英]How to make a deep copy of an NSMutableArray property of a Custom Object
[英]assign NSMutableArray with @property and 'copy' attribute
我正在关注官方教程你的第二个iOS应用程序:Storyboard ,它告诉我像这样声明一个属性masterBirdSightingList (只是一个特定的例子,不需要知道上下文):
@property (nonatomic, copy) NSMutableArray *masterBirdSightingList;
请注意,有一个属性副本 。 然后合成这个属性:
@synthesize masterBirdSightingList = _masterBirdSightingList;
接下来有一个让我困惑的init方法:
- (void)initializeDefaultDataList {
NSMutableArray *sightingList = [[NSMutableArray alloc] init];
self.masterBirdSightingList = sightingList;
[self addBirdSightingWithName:@"Pigeon" location:@"Everywhere"];
}
绝对是为空格分配了sightingList,然后将它分配给masterBirdSightingList属性。 但是,该属性具有复制属性。 这意味着实例变量_masterBirdSightingList将为另一个空间,从sightingList保存的东西进行分配。 为什么? 为什么不直接为属性分配空间,如下所示:
self.masterBirdSightingList = [[NSMutableArray alloc] init];
在Objective-C中,属性中的copy
属性意味着合成的setter将如下所示:
-(void)setMasterBirdSightingList:(NSMutableArray*)newValue
{
if (_masterBirdSightingList == newValue) return;
// NSMutableArray* oldValue = _masterBirdSightingList;
_masterBirdSightingList = [newValue copy];
// [oldValue release]; // <-- not applicable in ARC.
}
并且点语法将始终转换为
[self setMasterBirdSightingList:sightingList];
无论属性的属性如何。
“分配给另一个空间来保存来自sightingList的东西”的东西是通过-copy
方法完成的。 将参数传递给setter的newValue
参数的方式无关紧要。
编辑 :正如注释中提到的@David一样 ,可变类型的-copy
方法返回一个不可变对象。 您必须覆盖setter才能调用-mutableCopy
。 请参阅使用可变对象的Obj-C 2.0属性的最佳方法是什么,例如NSMutableArray? 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.