2013-02-13 96 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

相關問題