当我将字典传递@{@"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表达式似乎会产生非BOOL类型的值。
但是在用C ++重写上面的代码之后,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)
吗?
这是Objective-C的C部分。与c的逻辑运算符,如&&
,||
和!
所有它们的操作数进行比较是(未)等于0并返回一个int
0或1值。这从最初不具有C个茎任何内置布尔类型。
因此,在您的表达式@(!var)
中!var
具有has类型int
并__NSCFNumber
创建了一个对象。
高温超导
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句