【发布时间】: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