从可变字典中删除对象会引发异常

pmf*_*pmf 9 cocoa nsdictionary ios

尝试从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"];
Run Code Online (Sandbox Code Playgroud)

这与崩溃

*由于未捕获的异常'NSInternalInconsistencyException'终止应用程序,原因:' - [__ NSCFDictionary removeObjectForKey:]:发送到immutable对象的mutating方法'

这有什么不对吗?谢谢.

mtt*_*trb 10

这里的问题是,由于它是一个类集群,因此它们都返回NSDictionaryNSMutableDictionary返回.__NSCFDictionaryclassNSDictionary

我想你只需要制作一本可变的settings字典副本,无论它是否可变.

NSMutableDictionary *mutableSettings = [settings mutableCopy];
Run Code Online (Sandbox Code Playgroud)

  • 此外,正如下划线所暗示的那样,`__ NSCFDictionary`是一个私有类.它不一定是唯一的字典类,并且不能保证永远存在.更相关的是,它是NSMutableDictionary的子类,所以*every*dictionary(即`__NSCFDictionary`的实例)是一种NSMutableDictionary.所有这些都意味着没有可靠的方法来判断字典或任何其他plist对象是否可变. (3认同)