重新認識一下OC 中的 BOOL 值

在處理服務器返回值時,遇到了一下的問題.之后注意到了 BOOL 值不是那么簡單的.
先說明一下問題, 下面是服務器返回的JSON 數據:

{
    success = 0,
    data = <null>,
    message = <null>,
    errorMessage = 登錄名或密碼不正確
}

上面的 JSON 我們可以看出 success 是一個 BOOL 值.好那個我做了如下的判斷.

  if (json[@"success"]  == YES) {
                NSLog(@"成功");
   } else {
                NSLog(@"失敗");
            }

看起來很簡單.但是** json[@"success"] == YES**這個判斷有一個警告.



比較一個指針和一個 integer. 運行結果是沒問題. BOOL 是一個指針??
當我去打印真實類型的時候

     NSLog(@"%@", [json[@"success"] class]);
    // __NSCFBoolean

__NSCFBoolean這個又是什么東西??
下面做幾個測試

#import <Foundation/Foundation.h>

static BOOL different (int a, int b) {
    return a - b;
}

int main(int argc, const char * argv[]) {

    bool a = YES;
    BOOL b = YES;
    Boolean c = YES;
    NSLog(@"a = %d, b = %hhd, c = %hhu", a, b, c);
    // a = 1, b = 1, c = 1

    if (different(11, 10) == YES) {
        NSLog(@"11 != 10");
    } else {
         NSLog(@"11 == 10");
    }
    // 11 != 10
    
    if (different(10, 11) == YES) {
        NSLog(@"10 != 11");
    } else {
        NSLog(@"10 == 11");
    }
    // 10 == 11
    
    if (different(512, 256) == YES) {
        NSLog(@"512 != 256");
    } else {
        NSLog(@"512 == 256");
    }
    // 512 == 256
    
    return 0;
}

看到前面默認打印的是1, 覺得還正常,后面完全就亂套了.到底怎么了.
通過進出objc/objc.h 我們看到 對于 BOOL 其實是
**typedef signed char BOOL; **
#define YES ((BOOL)1)
#define NO ((BOOL)0)

所以在 OC 中,當遇到處理真假的參數時,使用BOOL, 字面值是 YES 和 NO.由于signed char只有8位的存儲空間,超過8位的只取8位二進制進行判斷,所以才看到了.上面判斷出錯的情況.
所以在 c 中的 bool,0是假值,非0為真值,在 OC 中卻不是如此.

下面再看一下__NSCFBoolean.它其實是一個封裝好的對象.是NSNumber 類簇中的一個私有的類.

NSLog(@"%@", [@(YES) class]);
NSLog(@"%@", [@(1) class]);

// 結果:
// __NSCFBoolean
// __NSCFNumber

通過下面的圖,可以有更好的理解


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,768評論 0 9
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,210評論 30 471
  • 1、禁止手機睡眠[UIApplication sharedApplication].idleTimerDisabl...
    DingGa閱讀 1,143評論 1 6
  • 趁陽光正好,趁微風不噪。沒娶的別慌,待嫁的別忙。經營好自己,珍惜眼前的時光,及時盡孝,一切該來的總會到。你若盛開,...
    呂七七_閱讀 839評論 0 2
  • 連著上了好多天的班,終于有一天休息了,睡了一天!靜靜地聽著隔壁小孩的哭鬧,想想自己終將面對的人生,說句實話,...
    毛毛丶蟲閱讀 436評論 2 6