在服務器返回 json 數據的時候,時常會出現如下數據
"somevalue":null
這個時候,json 解析的時候,就會吧這個 null 解析成 NSNull 的對象,我們向這個 NSNull 對象發送消息的時候就會遇到 crash 的問題。
而且服務器返回數據中 null 值是不定的,我們也不太可能每個值都判斷一遍[somevalue
isKindOfClass:[NSNull class]]
下面教大家兩種方法:
AFNetworking
如果你使用了 AFNetworking,只需要增加如下代碼
((AFJSONResponseSerializer *)manager.responseSerializer).removesKeysWithNullValues = YES;
經過如上設置,所有 NSNull 的值,都變成了 nil,接下來又可以愉快的玩耍了。
沒有 AFNetworking
沒有使用 AFN 也沒關係,我們需要的只是向 NSNull 發消息不崩潰,已經有人實現了這個功能了
你只需要引入這個庫,什麼都不需要做,當你再向 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”]
的功能
可以參考以下兩篇文章