【问题标题】:Why [@(!var) class] return' __NSCFNumber rather' than' __NSCFBoolean'?为什么 [@(!var) class] 返回'__NSCFNumber'而不是'__NSCFBoolean'?
【发布时间】:2018-04-22 04:26:38
【问题描述】:

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

但是当我将字典更改为 @{@"MUTE":@(!flag)} 时,它会生成一个类似 { "MUTE" : 0 } 的 JSON,这是我们的服务器不接受的。

所以我写了一些测试代码来看看这里发生了什么:

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

似乎逻辑 NOT 表达式产生了一个非 BOOL 类型的值。

但是在用 C++ 重写上面的代码后,clang 告诉我一个不同的故事:

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) 出了什么问题吗?

【问题讨论】:

    标签: ios objective-c clang llvm


    【解决方案1】:

    这是 Objective-C 的 C 部分。 C 逻辑运算符,例如 &&||! 都将其操作数与(不)等于 0 进行比较,并返回 int 值 0 或 1。这源于 C 最初没有任何内置布尔类型。

    因此,在您的表达式 @(!var) 中,!var 的类型为 int,并创建了一个 __NSCFNumber 对象。

    HTH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多