2012-03-26 52 views
0

這些可能都很簡單YES | NO type questions。NSDictionary + ARC +複製與參考

我有一些包含其他NSDictionaries的NSDictionaries。比方說NSDictionary_ANSDictionary_B。這些在應用程序的生命中持續存在。

track.instrument = [NSDictionary_A objectForKey:@"Blue"];

後來它被改變了:

包含在NSDictionary_A的NSDictionaries是參考各種物體通過

track.instrument = [NSDictionary_A objectForKey:@"Red"];

所以,第一個問題:@property儀器合成+保留爲strong在設置新值之前,對於instrument,setter設置instrument的當前值爲nil,如果是這樣,是否會影響參考源NSDictionary_A - 換句話說,請將參考設置爲nil'?聽起來不對,只是寫出來..所以我覺得答案是NO在這裏。此外,它可能並不重要,既然在NSDictionary_A1參考持續的應用程序生命@property儀器存儲爲weakstrong,但因爲它是一個指針,應該是weak - YES

第二個問題:一個NSDictionary在NSDictionary_B被傳遞到一個對象,但它可以在NSDictionary中改變一些值:

track.playbackType = [NSDictionary_B objectForKey:@"Random"]; [track.playbackType objectForKey:@"maxRange"] = 20;

所以我應該在這裏做一個copy的NSDictionary在這裏,因爲它的值將會改變,或者我完全誤解了這整個參考傳遞thang?

回答

1

你越來越混淆了指針的工作方式。

對於第一個問題,「track.instrument」只是一個指針。所以它將從「指向零」開始。

這樣的:

track.instrument = [NSDictionary_A objectForKey:@"Blue"]; 

手段,「停止指向零,並指向對象」

如果你能保證你的字典將持續整個應用程序,然後它不事關,無論是@blue鍵永遠不會被分配。但爲了獲得正確的代碼,它應該很弱。

編輯:錯誤地讀了第二個問題。

第二個問題:

一下:

track.playbackType = [NSDictionary_B objectForKey:@"Random"]; 

第一指針指向的NSDictionary從字典。

[track.playbackType objectForKey:@"maxRange"] = 20; 

由於它是NSDictionary,這是無效的。你不能改變NSDictionaries,因爲它們是不可變的,它應該是NSMutableDictionary。

但是,如果您不想將修改後的版本放回到原始字典中,那麼您可以先複製它,但首先將其作爲NSMutableDictionary,然後進行更改。

NSMutableDictionary *mutableDict = [[NSDictionary_B objectForKey:@"Random"] mutableCopy]; 

track.playbackType = mutableDict; //Note how track.playbackType has to be NSMutableDictionary aswell. 

非常重要:因爲要創建一個 「新」 的字典。 track.playbackType必須是強壯的,否則它會在功能結束後立即拆除並且mutableDict超出範圍。

+0

謝謝,明白了!我甚至沒有考慮過這個不可改變的部分。 – 2012-03-26 09:08:55

0

引用只是指針,除非在以下情況下,將一個設置爲零將不起作用:它是最後一個強引用,而其他弱引用仍然存在。在那種情況下,所有弱引用將變爲零。強屬性會將舊值設置爲零,實際上是發送釋放呼叫,但這會影響REFERENCE,而不會影響參考的內容。

至於第二個問題,這是相當混亂,我需要更多的信息關於playbackType。你說它是一個NSDictionary,但NSDictionary沒有屬性maxRange,所以它必須是你定義的類型。你不能改變NSDictionary的值,因爲它是不可變的。

但是,這裏是一個通用的答案:如果你將一個指針傳遞給一個可變對象爲強(或甚至弱),你將能夠改變原始內容。如果將一個指向可變對象的指針作爲副本傳遞,則會得到一個不影響原始對象的新對象。