如何覆盖 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 集群的更多信息
当在字典中设置 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