如何覆盖 setObject: forKey: 方法(在 Foundation Framework 中)

how to override setObject: forKey: method (in Foundation Framework)

当在字典中设置 nil 值时,它会崩溃。 下面是代码。

NSMutableDictionary *dic = [@{} mutableCopy];
[dic setObject:nil forKey:@"test"];

这段代码会崩溃。那么有没有一种方法可以覆盖 setObject:forKey: 使其在传递 nil 时不会崩溃,就像这样:[dic setObject:nil forKey:@"test"];

谁能帮我解决这个问题?

无论如何你想逃避崩溃。正确的?为此,您的代码应该在 try-catch 块中

@try {
    NSMutableDictionary *dic = [@{} mutableCopy];
    [dic setObject:nil forKey:@"test"];
}
@catch (NSException *exception) {
    NSLog(@"%@",exception.reason);
}
@finally {

} 

//可以这样

NSNull *nullValue=[[NSNull alloc]init];//globally decalare
NSMutableDictionary *dic = [@{} mutableCopy];
[dic setObject:dic?dic:nullValue forKey:@"test"];

你不能,根据 NSDictionary 的文档:

In general, a key can be any object (provided that it conforms to the NSCopying protocol—see below), but note that when using key-value coding the key must be a string (see Key-Value Coding Fundamentals). Neither a key nor a value can be nil; if you need to represent a null value in a dictionary, you should use NSNull.

如果您仅使用 NSString 个实例作为键,您可以安全地使用 NSKeyValueCoding.h 中的下一个类别:

    @interface NSMutableDictionary<KeyType, ObjectType>(NSKeyValueCoding)

    /* Send -setObject:forKey: to the receiver, unless the value is nil, in which case send -removeObjectForKey:.
    */
    - (void)setValue:(nullable ObjectType)value forKey:(NSString *)key;

    @end

如果你想使用其他类型作为键,或者避免键为nil时出现异常,你可以创建自己的类别到NSMutableDictionary。例如:

    @interface NSMutableDictionary (CocoaFix)

    - (void)setObjectOrNil:(id)object forKeyOrNil:(id)key;

    @end

    @implementation NSMutableDictionary (CocoaFix)

    - (void)setObjectOrNil:(id)object forKeyOrNil:(id)key {
        if (object && key) {
            [self setObject:object forKey:key];
        }
    }

    @end

请注意,无法覆盖 NSMutableDictionary 的原始 setObject:forKey: 方法。通常,可以使用类别中的方法调配来做到这一点。但是 NSMutableDictionary 实际上是 class 集群。 NSMutableDictionary 的私人子 class 们在幕后做真正的工作。每个 subclasses 都有自己的 setObject:forKey: 实现,因为这个方法是原始方法。您可以在 https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/ClassClusters/ClassClusters.html

阅读有关 class 集群的更多信息