2012-12-12 59 views
0

我正在做'Your Second App'教程,它添加了以下代码行,它是masterBirdSightingList属性的setter。我只是有一个基本的问题:简单的iOS代码行解释

这条线是否就像我合成它一样?如果不是,是什么使它不同?

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

这取决于masterBirdSightingList的属性声明。这是强,弱或复制等... – thelaws

回答

3

如果属性被定义为:

@property (nonatomic, copy) NSMutableArray *masterBirdSightingList; 

然后实施该方法是不一样的只是使用@synthensize masterBirdSightingList;

使用缺省合成设置器,为可变容器类型定义属性与copy实际上并不像预期的那样工作。

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

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

查看此问题的另一种方法是在NSMutableArray上调用copy返回NSArray而不是NSMutableArray。这就是为什么默认综合属性设置器不能按预期工作(处理可变容器属性时)。所以你必须自己实现设置器,并在参数上调用mutableCopy

+0

感谢您的帮助 –

+0

快速跟进问题 - 那么为什么任何人都想在属性定义中使用“复制”,如果你只需要使用自定义合成器?似乎更多的工作是无用的。 –

+0

如果该属性是用'copy'定义的,而类型是不可变的,那么事情就像预期的那样工作,而不需要明确写出setter方法。你想为属性使用'copy',只要你想确保属性的值不会在你背后改变。没有'copy',如果原始值被改变,那么你的属性值也会改变。有些时候,这是好的,但大多数时候这是不希望的。 – rmaddy