iOS崩溃
2019-03-19 本文已影响25人
llt00
- [NSNull objectForKeyedSubscript:]: unrecognized selector sent to instance 0x1bf5599d0 崩溃的问题
问题原因
解析 JSON 数据时。因为在后端数据库里面,默认数据为 null ;当我们给一个 null( NSNull 对象)发送消息的话,很大可能会直接Crash( null 是有内存的),而发送给nil的话,是不会崩溃的。
解决方法
- AFNetworking
((AFJSONResponseSerializer *)manager.responseSerializer).removesKeysWithNullValues = YES;
经过如上设置,所有 NSNull 的值,都变成了 nil,接下来可以正常操作了。
2.没有使用 AFN 也没关系,我们需要的只是向 NSNull 发消息不崩溃,已经有人实现了这个功能了NullSafe ,你只需要引入这个库,什么都不需要做,当你再向 NSNull 对象发消息的时候,就不会 crash 了。
还有一种是自己封装方法:
#import "NSNull+OVNatural.h"
@implementation NSNull (OVNatural)
- (void)forwardInvocation:(NSInvocation *)invocation
{
if ([self respondsToSelector:[invocation selector]]) {
[invocation invokeWithTarget:self];
}
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
{
NSMethodSignature *sig = [[NSNull class] instanceMethodSignatureForSelector:selector];
if(sig == nil) {
sig = [NSMethodSignature signatureWithObjCTypes:"@^v^c"];
}
return sig;
}
@end
关于[NSMethodSignature signatureWithObjCTypes:“@^vc”]的功能
可以参考以下两篇文章:
Objective-C Runtime Programming Guide
Type Encodings