2012-08-23 28 views
0

我有一個NSMutableArray的NSMutableArray的訪問回國的NSArray

@property (copy, nonatomic) NSMutableArray *childrenArray; 

現在我初始化這樣的:

self.childrenArray = [NSMutableArray arrayWithArray:children]; 

孩子也高於nsmutable,

現在,當我從移除對象兒童陣列我得到這個錯誤:

[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent 

我立即明白我的刪除是在NSArray上調用的,所以我的查詢是爲什麼我的訪問者返回NSArray,因爲它應該返回NSMutableArray。

謝謝,

回答

2

首先,copy @property字面上發送copy到對象被設置。可變集合通過創建不可變副本來響應copy。可變的複製充斥着邊緣案例(其中很多已經在其他SO問題中被覆蓋)。

其次,你真的真的不希望屬性提供訪問對象內的可變狀態。你可能不想售賣可變的集合類。


布朗特:

發送copy到可變集合返回一個不可改變的副本。 A copy屬性不會保留可變性。

手動實現setter/getter來設置/返回可變實例可能是錯誤的。


認爲它是這樣的:

你有一個名爲「Person」擁有名爲「firstname」的性能等級。如果該屬性是可變的,有人可能會說:

[[aPerson firstName] setString:@"Joe"]; 

即你是否希望有人能夠改變你的名字,而不需要他們這樣做的任何通知?可能不會。但是,這是剛好你可以通過暴露一個可變容器中的對象的狀態。

+0

嗨,謝謝,我很抱歉,我無法得到你,你可以更簡單地解釋它,如果它的副本問題,那麼我應該使用保留? –

+0

嗨,讀一遍又一遍你的答案後,我的理解是:首先,我不manualy實施setter和getter,合成做的一切,所以這意味着當我用setter初始化我的可變數組,然後它調用複製和複製doesn'保持可變性,所以訪問器返回不可變。其次,所以我需要的是直接初始化成員而不是self.member like thisArray = [[NSMutableArray arrayWithArray:children] retain]; (糾正我,如果我仍然錯了)。謝謝 –

+0

我也認爲我應該使用保留語義而不是副本,因爲副本返回不可變。謝謝。 –