【问题标题】:Removing an object from a mutable dictionary throws an exception从可变字典中删除对象会引发异常
【发布时间】:2012-04-21 16:20:58
【问题描述】:

尝试从 NSMutableDictionary 中删除对象后出现异常。相关代码如下。 'settings' 被传递给方法并且可以是 NSDictionary 或 NSMutableDictionary。

 NSMutableDictionary *mutableSettings = nil;
 if ([settings isKindOfClass:[NSMutableDictionary class]])
     mutableSettings = (NSMutableDictionary *)settings;
 else 
     mutableSettings = [[[NSMutableDictionary alloc] initWithDictionary:settings] autorelease];

 [mutableSettings removeObjectForKey:@"akey"];

这会崩溃

* 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“-[__NSCFDictionary removeObjectForKey:]: mutating method sent to immutable object”

这有什么问题吗?谢谢。

【问题讨论】:

    标签: ios cocoa nsdictionary


    【解决方案1】:

    这里的问题是NSDictionaryNSMutableDictionary 都返回__NSCFDictionary 作为它们的class,因为NSDictionary 是一个类簇。

    我认为您只需要制作 settings 字典的可变副本,无论它是否可变。

    NSMutableDictionary *mutableSettings = [settings mutableCopy];
    

    【讨论】:

    • 另外,正如下划线所暗示的,__NSCFDictionary 是一个私有类。它不一定是唯一的字典类,也不能保证永远存在。更相关的是,它是 NSMutableDictionary 的子类,因此 every 字典(即__NSCFDictionary 的实例)是一种 NSMutableDictionary。所有这些都意味着没有可靠的方法来判断字典或任何其他 plist 对象是否可变。
    猜你喜欢
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    相关资源
    最近更新 更多