iOS崩溃

  • [NSNull objectForKeyedSubscript:]: unrecognized selector sent to instance 0x1bf5599d0 崩溃的问题

问题原因

解析 JSON 数据时。因为在后端数据库里面,默认数据为 null ;当我们给一个 null( NSNull 对象)发送消息的话,很大可能会直接Crash( null 是有内存的),而发送给nil的话,是不会崩溃的。

解决方法

  1. 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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容