2012-08-10 97 views
0

我正在使用被包含的方法來返回一個NSMutableDictionary的指針,它包含在一個NSArray中。但是,NSMutableArray(theOne)被創建爲不可互換的NSDictionary。這是一個問題,因爲我想用這種方法檢索後修改字典。Objective-C方法返回NSDictionary而不是NSMutableDictionary。爲什麼?

- (NSMutableDictionary*)getMatFromBoutKey:(NSString*) boutKey 
{ 
    /* 
    * Returns the mat object with the provided boutKey. 
    * Returns nil if no mat has that boutKey. 
    */ 

    NSUInteger idx = [[event objectForKey:@"mats"] indexOfObjectPassingTest: 
        ^BOOL (NSMutableDictionary* obj, NSUInteger idx, BOOL *stop) 
         { 
          return [[obj objectForKey:@"boutKey"] isEqualToString:boutKey]; 
         }]; 

    if (idx == NSNotFound) 
     return nil; 
    else { 
     NSMutableDictionary* theOne = [[event objectForKey:@"mats"] objectAtIndex: idx]; 
     return theOne; 
    } 
} 

這裏的調試器的圖像停在右後theOne第一次被引用斷點。

Image of the debugger showing that theOne is not mutable

爲什麼不是theOne可變的?我如何返回一個指向NSMutableDictionary的指針,以便在得到返回的值之後我可以修改它?

謝謝!

+0

是[event objectForKey:@「mats」]一個可變字典數組? – Selkie 2012-08-10 02:41:51

+0

什麼是事件?那來自哪裏? – rdelmar 2012-08-10 02:42:11

+0

不要用'get'前綴方法。這應該只是'matFromBoutKey:'。 – bbum 2012-08-10 02:54:40

回答

1

我打算假設你有一個數組字典。然後該數組包含一堆常規字典。所以,當你將它從數組中拉出時,無論分配給它什麼,它仍然是一個普通的字典。

例如,採取下面的代碼例如

NSDictionary *dict = [[NSDictionary alloc] init]; 
NSMutableDictionary *mutDict = dict; 

mutDict將包含一個普通的字典,因爲它沒有正確地被澆鑄爲可變字典。

要麼確保在創建數組,它是在[事件objectForKey:@「墊料」]你把NSMutable字典它內部或

使用

NSMutableDictionary* theOne = [[[event objectForKey:@"mats"] objectAtIndex: idx] mutableCopy]; 

當取出來的數據

+0

是的,event是一個NSMutableDictionary,帶有一個名爲mats的NSArray,mats可以保存NSMutableDictionaries。我確實把NSMutableDictionaries放入數組中。如果我在使用字典時使用mutableCopy,那隻會給我一個副本,而不是指向真實對象的指針,對吧?我正在更深入地研究我如何放置字典,以確保它們按照我的想法行事。 – Adam 2012-08-10 02:56:18

+0

我發現了這個問題。有一個重新分配給NSDictionaries墊子的循環。它是固定的。現在。謝謝! – Adam 2012-08-10 03:19:15

0

是否在代碼的其他位置插入爲可變的?如果是這樣,它應該返回爲可變的,如果不是,你可以發送mutableCopy消息來獲得一個可變副本(引用計數爲1,所以一定要在必要時釋放它)。

1

一般來說,當可變性不是絕對必要時,我認爲最好的做法是使用不可變對象。可變對象使用更多的內存,當然有可能被意外更改。也許在塊中正在改變爲枚舉(我不確定,但它是可能的,爲了更快的索引)。如果你想改變一個可變對象是通過mutableCopy。或使用其他方法。

+0

我實際上認爲,可變對象需要更多內存是一種常見的誤解。從我的理解來看,NSMutableDictionary只是NSDictionary的一個子類,其中拋出了更多的connivence方法。使用NSDictionary上的類別可能也可以完成相同的操作。 – endy 2012-08-10 02:49:51

+0

可變對象需要更多的內存,速度更慢,而且 - 真正的原因 - 打破封裝,導致易碎性。請注意,對於只有少數對象的集合,性能差異可以忽略不計。然而,脆弱性是一個重要問題。 – bbum 2012-08-10 02:53:57

+0

然而,我明白脆弱性問題,請您將信息發佈到哪裏,以獲取信息,它們速度較慢,需要更多內存?我幾乎可以肯定,我看到一個WWDC視頻,一位蘋果工程師說他們只是一個簡單的子類,具有方法。 – endy 2012-08-10 02:59:55

相關問題