使用@property和'copy'属性分配NSMutableArray

时间:2012-05-23 17:20:45

标签: objective-c ios

我正在关注官方教程你的第二个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];

1 个答案:

答案 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?