iphone - objectForKey stringValue 使我的应用程序崩溃?

标签 iphone objective-c null 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

但是,在我的 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/

相关文章:

ios - Swift segue fatal error

iphone - UITableView在离开框架时在单元格上随机滴答

iphone - UITableView内容大小和行高

objective-c - 用于 UI 主题的 iOS/Objective-C 设计模式

java - 如何在无空设计中实现List、Set、Map?

sql - 为什么 Postgres Group By NULL 选择不计数?

iphone - 在 UICollectionView 中检测滑动

objective-c - Objective C 中的天数列表

java - 为什么我的 Spring @Autowired 字段为空?

objective-c - 无法访问 Pod 内的 Pod lib 依赖项,只能在客户端 App 内访问