我有一个类,用于在数组中设置对象。在这个类中,我有一个自定义的“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
但是,在我的 initWithDictionary 方法中,以下代码使我的应用程序崩溃:
self.bookTitle = [[parsedDictionary objectForKey:@"book_title"] stringValue];
无论解析字典中的对象是 NSNull 或包含有效字符串,它都不起作用。仅当我执行以下操作(并且字符串不为空)时:
self.bookTitle = [parsedDictionary objectForKey:@"book_title"];
在这种情况下,stringValue
是否不正确?如果是这样,我如何正确使用它来设置正确的 NSNull
替换?
谢谢
最佳答案
您真的真的不想向 NSNull 添加一个类别来添加此类常见方法。这将改变应用程序中所有实例的 NSNull 行为,包括由底层框架创建的仅供私有(private)使用的实例。
如果您需要一个值类来表示“值不存在,因此我将返回这些默认值”的概念,请创建一个准确表示该概念的类或实例。
至于为什么会崩溃,在没有看到崩溃的实际细节之前我无法告诉你。
<小时/>而且,是的,向添加此类通用方法的类添加类别确实太不好。只需要插件或框架中的一小段代码即可:
if ([fooMaybeNull respondsToSelector: @selector(intValue)] bar = [fooMaybeNull intValue];
并不是非常牵强——由于正是这种不情愿的类别添加,我不得不调试令人讨厌的崩溃程序或不当行为。
如果您要通过类别向类添加方法,请为方法名称添加前缀,以便将它们与现有功能隔离。它仍然很脆弱,但可以控制。
关于iphone - objectForKey stringValue 使我的应用程序崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1823563/