Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C方法返回NSDictionary而不是NSMutableDictionary。为什么?_Objective C_Nsmutablearray_Objective C Blocks - Fatal编程技术网

Objective-C方法返回NSDictionary而不是NSMutableDictionary。为什么?

Objective-C方法返回NSDictionary而不是NSMutableDictionary。为什么?,objective-c,nsmutablearray,objective-c-blocks,Objective C,Nsmutablearray,Objective C Blocks,我使用included方法返回指向NSArray中包含的NSMutableDictionary的指针。但是,NSMutableArray(theOne)正在创建为不可变的NSDictionary。这是一个问题,因为我想在使用此方法检索字典后修改它 - (NSMutableDictionary*)getMatFromBoutKey:(NSString*) boutKey { /* * Returns the mat object with the provided bout

我使用included方法返回指向NSArray中包含的NSMutableDictionary的指针。但是,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之后立即在断点上停止的图像

为什么一个不可变?如何返回指向NSMutableDictionary的指针,以便在获得返回的值后修改它


谢谢

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

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

例如,以下面的代码为例

NSDictionary *dict = [[NSDictionary alloc] init];
NSMutableDictionary *mutDict = dict;
mutDict将包含一个常规字典,因为它尚未正确地转换为可变字典

在[event objectForKey:@“mats”]创建数组时,请确保将NSMutable字典放在其中,或者

使用


一般来说,在取出数据时,我认为在不严格需要可变性的情况下,最好使用不可变对象。可变对象使用更多内存,当然也有可能被意外更改。可能在块中,正在更改为枚举数(我不确定,但这是可能的。为了更快地索引)。如果要更改可变对象,请通过
mutableCopy
。或者使用其他方法。

事件对象forkey:@“mats”]是可变字典的数组吗?什么是事件?这是从哪里来的?不要用
get
作为方法的前缀。这应该是
matFromBoutKey:
。是的,[event objectForKey:@“mats”]是一个可变字典数组。我在另一个类中创建事件。事件既是该类的属性,也是保存上面代码的类的属性。谢谢@bbum,我会做出改变。事实上,我认为易变对象需要更多内存是一种常见的误解。据我所知,NSMutableDictionary只是NSDictionary的一个子类,上面有更多的convidence方法。NSDictionary上的一个类别可能也可以做到这一点。可变对象需要更多内存,速度较慢,而且——真正的原因——破坏封装,导致脆弱性。请注意,对于只有少数对象的集合,性能差异可以忽略不计。然而,脆弱性是一个重要的问题。我理解脆弱性问题。但是,你能不能在你获取信息的地方发布一个信息来源,说明它们速度较慢,需要更多的内存?我几乎可以肯定的是,我看过一个WWDC视频,其中一位苹果工程师说,它们只是一个带有connivence方法的简单子类。在我的例子中,我使用可变字典,因为我需要定期检查它们的内容。我只在一个地方换。我不确定我能做些什么来保护它们。那你就不应该使用可变字典了。如果您在字典中不断添加、删除和更改对象,则会使用可变字典。您可以访问常规NSDictionary的任意内容。一旦创建了字典,就不能添加、删除和更改键值对。是的,event是一个NSMutableDictionary,有一个名为mats的NSArray,mats保存NSMutableDictionary。我确实将NSMutableDictionaries放入数组中。如果我在取出字典时使用mutableCopy,这只会给我一个副本,而不是指向真实对象的指针,对吗?我正在更深入地研究我是如何把字典放进去的,以确保它们按照我的想法进行。我发现了问题所在。有一个循环,重新分配给NSD字典的垫子。已经修好了。现在。谢谢
NSMutableDictionary* theOne = [[[event objectForKey:@"mats"] objectAtIndex: idx] mutableCopy];