最近重构项目,由于项目数据比复杂,一些数据是可以自定义添加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]
异常了。