2012-12-12 61 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