为什么[@(!var)类]返回'__NSCFNumber而不是'__NSCFBoolean'?

欧锦涛

当我将字典传递@{@"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)吗?

CRD

这是Objective-C的C部分。与c的逻辑运算符,如&&||!所有它们的操作数进行比较是(未)等于0并返回一个int0或1值。这从最初不具有C个茎任何内置布尔类型。

因此,在您的表达式@(!var)!var具有has类型int__NSCFNumber创建了一个对象。

高温超导

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章