0

我正在使用包含的方法返回指向 NSMutableDictionary 的指针,该指针包含在 NSArray 中。然而,NSMutableArray (theOne) 被创建为一个不可变的 NSDictionary。这是一个问题,因为我想在使用此方法检索字典后对其进行修改。

- (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 后调试器在断点处停止的图像。

显示 theOne 不可变的调试器图像

为什么 theOne 不可变?如何返回指向 NSMutableDictionary 的指针,以便在获得返回给我的值后对其进行修改?

谢谢!

4

3 回答 3

1

我将假设您有一个数组字典。然后该数组包含一堆常规字典。因此,当您将其从数组中拉出时,无论您将其分配给什么,它仍然是一个常规字典。

例如,以下面的代码为例

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

mutDict 将包含一个常规字典,因为它没有正确地转换为可变字典。

要么确保在创建位于 [event objectForKey:@"mats"] 的数组时将 NSMutable 字典放入其中,要么

采用

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

取出数据时

于 2012-08-10T02:43:25.403 回答
1

一般来说,我认为当可变性不是严格必要时使用不可变对象是更好的做法。可变对象使用更多内存,当然也有可能被意外更改。也许在块中被更改为枚举器(我不确定,但有可能。为了更快的索引)。如果你想改变一个可变对象是 via mutableCopy。或使用其他方法。

于 2012-08-10T02:46:19.027 回答
0

它是否在代码的其他地方插入为可变的?如果是这样,它应该以可变的形式返回,如果不是,您可以向它发送mutableCopy消息以获取可变副本(引用计数为 1,因此请务必在必要时释放它)。

于 2012-08-10T02:38:19.263 回答