我正在做'你的第二个应用程序'教程,它让我在下面添加了一行代码,它是masterBirdSightingList属性的setter。我只是有一个基本的问题:
这条线是否与我合成它一样?如果没有,是什么让它与众不同?
- (void)setMasterBirdSightingList:(NSMutableArray *)newList
{
if (_masterBirdSightingList != newList) {
_masterBirdSightingList = [newList mutableCopy];
}
}
答案 0 :(得分:3)
如果属性定义为:
@property (nonatomic, copy) NSMutableArray *masterBirdSightingList;
然后实现此方法与仅使用@synthensize masterBirdSightingList;
。
使用默认的合成setter,为可变容器类型定义具有copy
语义的属性实际上不会按预期工作。
如果没有显式方法,实际上你最终会得到引用数组不可变副本的属性。
通过使用您发布的代码,您可以获得原始数组的可变副本的正确行为,而不是依赖于合成的方法。
另一种看待此问题的方法是,在copy
上调用NSMutableArray
会返回NSArray
,而不是NSMutableArray
。这就是默认的合成属性setter不能按预期工作的原因(处理可变容器属性时)。因此,您必须自己实现setter并在参数上调用mutableCopy
。