当我递过字典时
@{@"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)
?