run*_*mad 2 iphone null objective-c nsstring
我有一个类用于在数组中设置对象.在这个类中,我有一个自定义的"initWithDictionary",我解析一个JSON字典.但是,正如我遇到的那样NSNull,这会导致我的应用崩溃.为了解决这个问题,我设置了一个处理异常的类,所以当一个字符串是NSNull,它将替换它@"".或-1表示整数.
这是我的NullExtensions类:
@interface NSNull (valueExtensions)
-(int)intValue;
-(NSString *)stringValue;
@end
@implementation NSNull (valueExtensions)
-(int)intValue {
return -1;
}
-(NSString*)stringValue {
return @"";
}
@end
Run Code Online (Sandbox Code Playgroud)
但是,在我的initWithDictionary方法中,以下代码崩溃了我的应用程序:
self.bookTitle = [[parsedDictionary objectForKey:@"book_title"] stringValue];
Run Code Online (Sandbox Code Playgroud)
无论解析字典中的对象是否NSNull包含有效字符串,它都不起作用.只有我执行以下操作(并且字符串不为null):
self.bookTitle = [parsedDictionary objectForKey:@"book_title"];
Run Code Online (Sandbox Code Playgroud)
stringValue在这种情况下是不正确的?如果是这样,我如何正确使用它才能设置正确的NSNull替换?
谢谢
你真的真的不想添加类别NSNull,增加了这样的常用方法.这将改变应用程序中所有实例的NSNull行为,包括由底层框架创建的仅供私人使用的实例.
如果您需要一个表示"值不存在,因此我将返回这些默认值"的概念的值类,请创建一个完全代表该值的类或实例.
至于它崩溃的原因,我没有看到崩溃的实际细节就告诉你.
而且,是的,它确实是 THAT不好的类别增加,增加了这样一个共同的方法的类.所需要的只是插件或框架中的一点代码:
if ([fooMaybeNull respondsToSelector: @selector(intValue)] bar = [fooMaybeNull intValue];
Run Code Online (Sandbox Code Playgroud)
不是非常牵强 - 我不得不调试令人讨厌的骚扰者或不当行为,因为正是这种不知名的类别添加.
如果要通过类别向类添加方法,请在方法名称前添加前缀,以便将它们与现有功能隔离开来.它仍然很脆弱,但可以管理.
而不是在 上创建类别NSNull,您还必须为其添加一个类似的类别NSString(这就是它崩溃的原因,因为真正的字符串不响应 stringValue) - 而是尝试使用 Johan 发布的代码创建一个NSDictionary像“ stringForKey”这样的辅助类别并返回一个NSString,可能还应该强制所有其他类型也映射到空字符串。