解析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;
发生了什么?
由于
答案 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上调用任何方法