2012-08-10 33 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

相关问题