关于[NSNull length]异常

最近重构项目,由于项目数据比复杂,一些数据是可以自定义添加key和value的。所以在service层并不能直接转化为对应的model,只能在显示层按需解析。


今天收到一些异常信息,都是关于[NSNull length]的错误信息。而我自己在Debug时并未遇到,检查代码很久发现了问题所在。

原来,服务器发的Jason数据是含有value为null对象的map数据转的Jason,所以ios端解析成字典value就成了NSNull对象,当在UI端用label.text = value时就会报[NSNull length]错。
于是我在代码中给label赋值text时,做了value的类型判断:

[value isKindOfClass:[NSNull class]]

但是,这样需要加这个判断的地方就会有很多个,代码就不太好看了。换个思路,用runtime的Method Swizzling来做个替换,具体代码如下:

@implementation UILabel (nullException)
    +(void)load
    {
        [super load];
        // 设置text时替换方法
        Method method1 = class_getInstanceMethod([self class], @selector(setText:));
        Method method2 = class_getInstanceMethod([self class], @selector(setNullExceptionText:));
        // 验证是否添加过方法
        if (!class_addMethod(self, @selector(setText:), method_getImplementation(method2), method_getTypeEncoding(method2))) {
            // 添加过则交换方法指针
            method_exchangeImplementations(method1, method2);
        }
    }
    - (void)setNullExceptionText:(NSString *)text
    {
        if ([text isKindOfClass:[NSString class]]) {
            [self setNullExceptionText:text];
        }else if ([text isKindOfClass:[NSNumber class]]){
            [self setNullExceptionText:[text performSelector:@selector(stringValue)]];
        }else{
            [self setNullExceptionText:nil];
        }
    }
    @end

这样简单的交换一下方法实现,就可以不用动以前的代码,并且保证不会报[NSNull length]异常了。

你可能感兴趣的:(关于[NSNull length]异常)