runtime解决服务器返回NSNull问题

众所周知,服务器返回的数据时不时的就不靠谱一下,返回NSNull类型引起客户端crash,这种定时炸弹我们如果通过:

[des isKindOfClass:[NSNull class]]

这样判断只能解决某个问题,然而对于不确定的返回null无法下手,另外到处写这种代码看起来也是很不爽。

解决:利用消息转发

消息转发不了解的可以自行百度

在写的时候,我们要考虑@"",@0,@{},@[]这几种常用的类型空值, NSNull实例在调用到一些不属于它的方法的时候, 如果@"",@0,@{},@[]可以响应的时候就丢给他们去处理去。

比如 调用 intvalue,可以丢给@0去处理。

详细代码说明


#import "NSNull+safe.h"

#define NullObjects @[@"",@0,@{},@[]]

@implementation NSNull (safe)
//必须返回一个方法签名不能为空
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
    NSMethodSignature *signature = [super methodSignatureForSelector:selector];
    
    if (signature != nil) return signature;
    
    for (NSObject *object in NullObjects) {
        
        signature = [object methodSignatureForSelector:selector];
        
        if (signature) {
            //strcmp比较两个字符串,相同返回0
            //这里 @ 是指返回值为对象 id
            if (strcmp(signature.methodReturnType, "@") == 0) {
                
                signature = [[NSNull null] methodSignatureForSelector:@selector(__returnNil)];
            }
            break;
        }
    }
    
    return signature;
}
//消息转发的最后一步
- (void)forwardInvocation:(NSInvocation *)anInvocation {
    //如果返回值是对象 设置方法为__returnNil
    if (strcmp(anInvocation.methodSignature.methodReturnType, "@") == 0) {
        anInvocation.selector = @selector(__returnNil);
        [anInvocation invokeWithTarget:self];
        return;
    }
    //遍历 查看 @"",@0,@{},@[]  那个响应了selector,然后丢给它去执行
    for (NSObject *object in NullObjects) {
        
        if ([object respondsToSelector:anInvocation.selector]) {
            
            [anInvocation invokeWithTarget:object];
            return;
        }
    }
    //抛出异常
    [self doesNotRecognizeSelector:anInvocation.selector];
}

- (id)__returnNil {
    return nil;
}

@end

demo地址
欢迎star

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 众所周知,服务器返回的数据时不时的就不靠谱一下,返回NSNull类型引起客户端crash,这种定时炸弹我们如果通过...
    corki_iOS阅读 3,308评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,273评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 177,170评论 25 709
  • “撒泼打滚要玩具”这个问题大概很多家庭都经历过。大部分教育者都觉得这是个锻炼“延迟满足”能力的好时机,并给出了解决...
    孤独症康复阅读 2,823评论 0 0
  • 旧时光薄凉,情感浅淡,一转身就只剩下一声感叹…… 我总是可以看到一树一树的木棉花,妖娆的花朵,随风旋落,用一种寂寞...
    天晴有时雨阅读 2,144评论 0 0

友情链接更多精彩内容