简单的iOS代码行说明

时间:2012-12-12 20:43:04

标签: objective-c ios

我正在做'你的第二个应用程序'教程,它让我在下面添加了一行代码,它是masterBirdSightingList属性的setter。我只是有一个基本的问题:

这条线是否与我合成它一样?如果没有,是什么让它与众不同?

- (void)setMasterBirdSightingList:(NSMutableArray *)newList
{
     if (_masterBirdSightingList != newList) {
            _masterBirdSightingList = [newList mutableCopy];
     }
}

1 个答案:

答案 0 :(得分:3)

如果属性定义为:

@property (nonatomic, copy) NSMutableArray *masterBirdSightingList;

然后实现此方法与仅使用@synthensize masterBirdSightingList;

不同

使用默认的合成setter,为可变容器类型定义具有copy语义的属性实际上不会按预期工作。

如果没有显式方法,实际上你最终会得到引用数组不可变副本的属性。

通过使用您发布的代码,您可以获得原始数组的可变副本的正确行为,而不是依赖于合成的方法。

另一种看待此问题的方法是,在copy上调用NSMutableArray会返回NSArray,而不是NSMutableArray。这就是默认的合成属性setter不能按预期工作的原因(处理可变容器属性时)。因此,您必须自己实现setter并在参数上调用mutableCopy