我正在关注官方教程你的第二个iOS应用程序:故事板,它告诉我像这样声明一个属性 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];
答案 0 :(得分:7)
在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];
无论属性的属性如何。
&#34;分配给另一个空间以保存来自目击列表的内容&#34;东西是通过-copy
方法完成的。将参数传递给setter的newValue
参数的方式无关紧要。
编辑:作为评论中提到的@David,可变类型的-copy
方法返回一个不可变对象。您必须覆盖设置器才能调用-mutableCopy
。请参阅What's the best way to use Obj-C 2.0 Properties with mutable objects, such as NSMutableArray?。