代码之家  ›  专栏  ›  技术社区  ›  Jintao Ou

为什么[@(!var)class]返回“\u NSCFNumber”而不是“\u NSCFBoolean”?

  •  1
  • Jintao Ou  · 技术社区  · 7 年前

    当我递过字典时 @{@"MUTE":@(flag)} +[NSJSONSerialization dataWithJSONObject:options:error:] ,它返回类似JSON的 { "MUTE" : true } ,这正是我所期望的。

    但是当我把字典改成 @{@"MUTE":@(!flag)} ,它生成如下JSON { "MUTE" : 0 } ,这是我们的服务器无法接受的。

    因此,我编写了一些测试代码来了解这里发生了什么:

    BOOL var = YES;
    NSLog(@"%@", [@(var) class]);       // print __NSCFBoolean
    NSLog(@"%@", [@(!var) class]);      // print __NSCFNumber
    NSLog(@"%@", [@((BOOL)!var) class]);// print __NSCFBoolean
    

    逻辑NOT表达式似乎生成非布尔类型的值。

    但是在用C++重写了上面的代码之后,这个叮当声告诉了我一个不同的故事:

    BOOL var = ((bool)1);
    
    NSLog((NSString *)&__NSConstantStringImpl__var_folders_vg_0k7tkth9043fl0g9sf5l9l3w0000gn_T_main_8479d3_mi_0, ((Class (*)(id, SEL))(void *)objc_msgSend)((id)((NSNumber *(*)(Class, SEL, BOOL))(void *)objc_msgSend)(objc_getClass("NSNumber"), sel_registerName("numberWithBool:"), (BOOL)(var)), sel_registerName("class")));
    NSLog((NSString *)&__NSConstantStringImpl__var_folders_vg_0k7tkth9043fl0g9sf5l9l3w0000gn_T_main_8479d3_mi_1, ((Class (*)(id, SEL))(void *)objc_msgSend)((id)((NSNumber *(*)(Class, SEL, BOOL))(void *)objc_msgSend)(objc_getClass("NSNumber"), sel_registerName("numberWithBool:"), (BOOL)(!var)), sel_registerName("class")));
    NSLog((NSString *)&__NSConstantStringImpl__var_folders_vg_0k7tkth9043fl0g9sf5l9l3w0000gn_T_main_8479d3_mi_2, ((Class (*)(id, SEL))(void *)objc_msgSend)((id)((NSNumber *(*)(Class, SEL, BOOL))(void *)objc_msgSend)(objc_getClass("NSNumber"), sel_registerName("numberWithBool:"), ((BOOL)!var)), sel_registerName("class")));
    

    任何人都知道 @(!var) ?

    1 回复  |  直到 7 年前
        1
  •  3
  •   CRD    7 年前

    这是Objective-C的C部分 && ,则, || ! 所有操作数都将其操作数比较为(un)等于0,并返回 int 值为0或1。这源于C最初没有任何内置布尔类型。

    所以在你的表情中 @(!var) 这个 !var 具有类型 内景 __NSCFNumber 对象已创建。