2

我經常需要更改NSArrayNSDictionary的內容。通常我這樣做:NSDictionary - >創建NSMutableDictionary並編輯它 - >用編輯的替換原來的NSDictionary(作爲不可變)。可變拷貝與其他創建方法之間的區別

我知道這樣做有兩種方式:

1)使用mutable copycopy

NSDictionary *myDictionary = @{...}; 
NSMutableDictionary *dicToEdit = myDictionary.mutableCopy; 
// Editing goes here` 
myDictionary = dicToEdit.copy; 

2)使用arrayWithArray:dictionaryWithDictionary:

NSDictionary *myDictionary = @{...}; 
NSMutableDictionary *dicToEdit = [NSMutableDictionary dictionaryWithDictionary:myDictionary]; 
// Editing goes here 
myDictionary = [NSDictionary dictionaryWithDictionary:dicToEdit]; 

是否有這兩個之間有什麼區別方法?或者兩種方式之一有問題嗎?

+1

它們是等價的。很可能共享相同的代碼。 'mutableCopy'是「通用」方法,適用於任何具有可變孿生的類。 –

回答

6

首先,我建議不要使用屬性點語法myDictionary.mutableCopy而不是方法消息傳遞語法[myDictionary mutableCopy]。這些意思完全相同,但我只保存實際屬性的點符號(copymutableCopy是方法,而不是屬性)。

要回答你的問題,這兩種複製字典的內部工作方式可能存在細微的差異,但我相信它們在功能上是非常相同的。

我可能會建議使用2)因爲雖然略低於簡潔我會說,它使代碼的意圖更清晰,更區別於當你需要兩個不同的NSDictionary *變量指向相同的字典。我想說2)使代碼語義更容易理解。用1)指示接收對象是否要獲得可變不可變副本。用2)你不關心你正在嘗試複製的字典是否可變或不可變:結果字典的可變性取決於你使用的init方法。

但最終它只是歸結爲個人喜好,我猜。

+0

感謝您的回答。關於點語法,我不得不提及,我儘可能使用點語法(以及使用{}和[])的字典和數組的現代語法。在我看來,點語法使代碼更清晰。儘管我認爲你在邏輯上完全正確,但我更喜歡在最後使用點而不是一堆]]]]; – FrankZp

+0

就你而言,這只是個人偏好。請注意,*屬性*只是*實例變量*由* accessor方法*支持(訪問方法可以自動合成,手動實現或兩者的組合)。所以你實際上在所有情況下使用方法,不論是否使用點語法。就我個人而言,我更喜歡我的代碼讓我容易理解是否使用明確定義的方法(我避免使用點語法),或者我正在使用通過屬性合成或實現的方法(我使用點語法)。根據我的經驗,這使得協作和維護更加容易。 ;-) –