重新认识一下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

通过下面的图,可以有更好的理解


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,423评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,147评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,019评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,443评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,535评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,798评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,941评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,704评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,152评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,494评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,629评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,295评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,901评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,978评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,333评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,499评论 2 348

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,690评论 0 9
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,131评论 30 470
  • 1、禁止手机睡眠[UIApplication sharedApplication].idleTimerDisabl...
    DingGa阅读 1,116评论 1 6
  • 趁阳光正好,趁微风不噪。没娶的别慌,待嫁的别忙。经营好自己,珍惜眼前的时光,及时尽孝,一切该来的总会到。你若盛开,...
    吕七七_阅读 826评论 0 2
  • 连着上了好多天的班,终于有一天休息了,睡了一天!静静地听着隔壁小孩的哭闹,想想自己终将面对的人生,说句实话,...
    毛毛丶虫阅读 423评论 2 6