2013-02-13 203 views
1

我正在学习Apple的Your Second iOS App。该项目基于ARC。为什么mutableCopy在这里?

而且在学习的例子,我曾与从上述例子中,下面的代码一个问题:

// header 
@interface BirdSightingDataController : NSObject 

@property (nonatomic, copy) NSMutableArray *masterBirdSightingList; 

@end 

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

- (void)initializeDefaultDataList { 
    NSMutableArray *sightingList = [[NSMutableArray alloc] init]; 
    self.masterBirdSightingList = sightingList; 

    … 
} 

我不知道为什么这个代码推翻的masterBirdSightingList默认setter方法。

masterBirdSightingList属性的类型为NSMutableArray,并且被复制到_masterBirdSightingList实例变量,该变量的类型也是NSMutableArray。我认为这是完美的。

为什么_masterBirdSightingList = [newList mutableCopy];在这里?以防万一setMasterBirdSightingList:被称为NSArray类型的参数?

+0

我会说是的,这是考虑到传递静态数组的情况。因为masterBirdSightingList被声明为可变数组,所以此代码强制执行该操作,以防止其他代码尝试对NSArray进行变异时出现问题 – Bergasms 2013-02-13 03:47:43

+0

有趣的是,即使调用者将可变数组传递给setter,这也是必需的。 – 2013-02-13 03:52:03

+0

这里是否有'copy'标记?我只是在那里告诉编译器如何综合属性访问器,因为它们不是在这里被合成的... – cHao 2013-02-13 03:53:04

回答

2

它是需要的,因为默认实现将简单地调用copy,并且您将以不可变数组而不是可变数组结束。

+3

为了进一步阐明,在'NSMutableArray'上调用'copy'方法实际上将副本作为不可变的NSArray'返回,而不是另一个'NSMutableArray'。 – rmaddy 2013-02-13 03:58:18