runtime解決服務(wù)器返回NSNull問題

眾所周知,服務(wù)器返回的數(shù)據(jù)時不時的就不靠譜一下,返回NSNull類型引起客戶端crash,這種定時炸彈我們?nèi)绻ㄟ^:

[des isKindOfClass:[NSNull class]]

這樣判斷只能解決某個問題,然而對于不確定的返回null無法下手,另外到處寫這種代碼看起來也是很不爽。

解決:利用消息轉(zhuǎn)發(fā)

消息轉(zhuǎn)發(fā)不了解的可以自行百度

在寫的時候,我們要考慮@"",@0,@{},@[]這幾種常用的類型空值, NSNull實例在調(diào)用到一些不屬于它的方法的時候, 如果@"",@0,@{},@[]可以響應(yīng)的時候就丟給他們?nèi)ヌ幚砣ァ?/p>

比如 調(diào)用 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;
}
//消息轉(zhuǎn)發(fā)的最后一步
- (void)forwardInvocation:(NSInvocation *)anInvocation {
    //如果返回值是對象 設(shè)置方法為__returnNil
    if (strcmp(anInvocation.methodSignature.methodReturnType, "@") == 0) {
        anInvocation.selector = @selector(__returnNil);
        [anInvocation invokeWithTarget:self];
        return;
    }
    //遍歷 查看 @"",@0,@{},@[]  那個響應(yīng)了selector,然后丟給它去執(zhí)行
    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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 眾所周知,服務(wù)器返回的數(shù)據(jù)時不時的就不靠譜一下,返回NSNull類型引起客戶端crash,這種定時炸彈我們?nèi)绻ㄟ^...
    corki_iOS閱讀 506評論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,765評論 25 709
  • “撒潑打滾要玩具”這個問題大概很多家庭都經(jīng)歷過。大部分教育者都覺得這是個鍛煉“延遲滿足”能力的好時機,并給出了解決...
    孤獨癥康復(fù)閱讀 395評論 0 0
  • 舊時光薄涼,情感淺淡,一轉(zhuǎn)身就只剩下一聲感嘆…… 我總是可以看到一樹一樹的木棉花,妖嬈的花朵,隨風(fēng)旋落,用一種寂寞...
    天晴有時雨閱讀 316評論 0 0

友情鏈接更多精彩內(nèi)容