美文网首页
runtime解决服务器返回NSNull问题

runtime解决服务器返回NSNull问题

作者: W_zzz | 来源:发表于2017-04-16 19:38 被阅读0次

众所周知,服务器返回的数据时不时的就不靠谱一下,返回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

相关文章

  • runtime解决服务器返回NSNull问题

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

  • runtime解决服务器返回NSNull问题

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

  • iOS 相关技巧

    1、,解决后台返回数据包含NSNull的问题,这个问题好坑github

  • NSDictionary分类CLNull(解决服务器返回的jso

    我们在处理服务器返回的数据类型为NSNull时,程序就会闪退。我们可以先判断该数据类型是否为NSNull,是就返回...

  • NSNull 的 Crash问题解决

    解决NSNull造成的crash问题 在我们的开发中,很多时候后台会返回null,到了我们iOS这一端,就成为了N...

  • 使用AFN去掉 Null

    服务器有可能返回 null 数据,iOS会自动帮我们转成 NSNull 对象,直接进行归档就会失败 使用 AFNe...

  • AF解析json的时候报错:Error Domain=NSCoc

    问题产生原因:服务器返回的字符串里面有换行符 解决方案1:服务器修改 解决方案2:代码解决 一.self.mana...

  • 服务器返回<null>处理

    写项目碰到服务器返回或者null,这个类型对于iOS来说这是一个NSNULL类型,既不是字符串,也不是...

  • 解决json串中的NSNull类型数据

    服务器返回的数据中总会出现一些NSNull类型的数据,当我们一处理,程序就会崩溃,因此想到把返回的数据中的NSNu...

  • 运行时runTime

    runtime在工作总遇到的问题: 1.runtime的几个问题 2.runtime解决重复点击UIButton的...

网友评论

      本文标题:runtime解决服务器返回NSNull问题

      本文链接:https://www.haomeiwen.com/subject/rvaaattx.html