4

我正在关注官方教程Your second iOS App:Storyboard它告诉我要像这样声明一个属性masterBirdSightingList(只是一个具体的例子,不需要知道上下文):

@property (nonatomic, copy) NSMutableArray *masterBirdSightingList;

请注意,有一个属性copy。然后合成这个属性:

@synthesize masterBirdSightingList = _masterBirdSightingList;

接下来是一种让我感到困惑的初始化方法:

- (void)initializeDefaultDataList {
NSMutableArray *sightingList = [[NSMutableArray alloc] init];
self.masterBirdSightingList = sightingList;
[self addBirdSightingWithName:@"Pigeon" location:@"Everywhere"];
}

肯定会为空间分配SightingList,然后将其分配给masterBirdSightingList 属性。但是,该属性具有复制属性。这意味着实例变量_masterBirdSightingList将被分配给另一个空间以保存来自SightingList的东西。为什么?为什么不直接为这样的属性分配空间:

self.masterBirdSightingList = [[NSMutableArray alloc] init];
4

1 回答 1

8

在 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方法完成的。将参数传递给 setternewValue参数的方式无关紧要。


Edit: As @David mentioned in the comment, the -copy method of a mutable type returns an immutable object. You have to override the setter to call -mutableCopy instead. See What's the best way to use Obj-C 2.0 Properties with mutable objects, such as NSMutableArray?.

于 2012-05-23T17:34:51.480 回答