objectForKey stringValue崩溃我的应用程序?

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替换?

谢谢

bbu*_*bum 5

你真的真的不想添加类别NSNull,增加了这样的常用方法.这将改变应用程序中所有实例的NSNull行为,包括由底层框架创建的仅供私人使用的实例.

如果您需要一个表示"值不存在,因此我将返回这些默认值"的概念的值类,请创建一个完全代表该值的类或实例.

至于它崩溃的原因,我没有看到崩溃的实际细节就告诉你.


而且,是的,它确实 THAT不好的类别增加,增加了这样一个共同的方法的类.所需要的只是插件或框架中的一点代码:

if ([fooMaybeNull respondsToSelector: @selector(intValue)] bar = [fooMaybeNull intValue];
Run Code Online (Sandbox Code Playgroud)

不是非常牵强 - 我不得不调试令人讨厌的骚扰者或不当行为,因为正是这种不知名的类别添加.

如果要通过类别向类添加方法,请在方法名称前添加前缀,以便将它们与现有功能隔离开来.它仍然很脆弱,但可以管理.


Ken*_*ner 5

而不是在 上创建类别NSNull,您还必须为其添加一个类似的类别NSString(这就是它崩溃的原因,因为真正的字符串不响应 stringValue) - 而是尝试使用 Johan 发布的代码创建一个NSDictionary像“ stringForKey”这样的辅助类别并返回一个NSString,可能还应该强制所有其他类型也映射到空字符串。

  • 再说一遍——不要这样做。它最终会咬你,当它咬你的时候,这将是一个彻头彻尾的麻烦。如果要添加这样的方法,请为其添加前缀。 (3认同)