NSNull stringByReplacingOccurrencesOfString:withString:JSON问题

时间:2014-09-26 10:46:33

标签: ios objective-c json

解析JSON时遇到问题:

在mycallback方法中我复制对象的关键字" a"在NSDictionary *测试中如下:

[[test sharedManager] MyTestCallback:^(MyTestSessionStatus status, NSDictionary * t, NSError * error){


test = [t objectForKey:@"a"];
}

然后在另一种方法中,我在数组中复制值

NSArray *temp = [discoveredMedia valueForKeyPath:@"b"];

然后当我尝试做

NSString *temp2 = (NSString *)[temp objectAtIndex:0];

但价值是 - > temp2的打印描述:< null>

并在调试器中 - > temp2 NSString * class name = NSNull 0x383ed3d0

时粉碎了

temp2 = (NSString *)[temp2 stringByReplacingOccurrencesOfString:@"<$size$" withString:@"350"];

在控制台中:

由于未捕获的异常终止应用程序&#39; NSInvalidArgumentException&#39;,原因:&#39; - [NSNull stringByReplacingOccurrencesOfString:withString:]:无法识别的选择器发送到实例0x383ed3d0&#39;

发生了什么?

由于

2 个答案:

答案 0 :(得分:1)

在JSON中你有&#39; null&#39;在字典中它将返回目标c而不是nil但NSNull。 你需要将NSNull视为零。

答案 1 :(得分:0)

我做了一个简单的NSNull解决方法,以避免NSNull调用崩溃

1)在AppDelegate中添加此代码

#import "EXTNil.h"
#import <objc/runtime.h>

+ (id)swizzled_null
{
    return [EXTNil null];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    SEL originalSelector = @selector(null);
    SEL swizzledSelector = @selector(swizzled_null);

    Method originalMethod = class_getClassMethod([NSNull class], originalSelector);
    Method swizzledMethod = class_getClassMethod([self class], swizzledSelector);
    method_exchangeImplementations(originalMethod, swizzledMethod);
    return YES;
}

2)从repo添加(EXTNil和EXTRuntimeExtensions)类到您的项目 https://github.com/jspahrsummers/libextobjc/tree/master/extobjc

现在您可以在NSNull上调用任何方法