代码之家  ›  专栏  ›  技术社区  ›  Jintao Ou

[Objective-C++]为什么在64位中允许将对象分配给BOOL类型变量,但在32位中不允许

  •  1
  • Jintao Ou  · 技术社区  · 6 年前

    - (void)viewDidLoad {
        [super viewDidLoad];
        BOOL var = [[NSUserDefaults standardUserDefaults] objectForKey:@"foo"];
        NSLog(@"%d", var);
    }
    

    但是,当我将运行目标更改为32位设备(例如,iPhone 5)时,会显示如下错误:

     Cannot initialize a variable of type 'BOOL' (aka 'signed char') with an rvalue of type 'id _Nullable'
    

    我知道这项任务很痛苦,但为什么在第一种情况下允许这样做呢?

    3 回复  |  直到 6 年前
        1
  •  3
  •   Ken Thomases    6 年前

    对于64位iOS BOOL _Bool bool ). 该类型被定义为只有两个值,0或1。将任何其他值赋给该类型的变量会使其取值为1。(即,所有非零值都变为1。)

        2
  •  1
  •   trungduc 邱林和    6 年前

    错误表示您正在将对象分配给类型为的变量 BOOL objectForKey: boolValue .

    BOOL var = [[[NSUserDefaults standardUserDefaults] objectForKey:@"foo"] boolValue];
    
        3
  •  1
  •   Grady Player    6 年前

    您的代码:
    BOOL var = [[NSUserDefaults standardUserDefaults] objectForKey:@"foo"];
    将一个对象的地址分配给某个大小的int。。。

    这几乎总是不是你想要的。您可能想要:
    BOOL var = [[[NSUserDefaults standardUserDefaults] objectForKey:@"foo"]boolValue];

    如果确实要基于该对象的存在进行分配,可以执行以下操作:
    BOOL var = !![[NSUserDefaults standardUserDefaults] objectForKey:@"foo"];

    原因是,如果地址的底部8位恰好都是0,那么它可能是一个有效的对象,但将是一个假值,这将是截断赋值的结果。

    int main(int argc, const char * argv[]) {
    
        BOOL b = 2;
        if (b == YES)
        {
            NSLog(@"I guess you are right");
        }else{
            NSLog(@"nope");
        }
    

    nope

        4
  •  1
  •   uliwitness    6 年前

    有几件事影响了这项工作的原因,很多都是历史上的事情,只是因为过去是这样。

    1. bool 是一种相对较新的类型。如果你看一下旧的C代码,你会经常看到它们只是使用 int ,或者像Objective-C编译器一样声明自己的 Bool BOOL Boolean 类型。

    2. signed char 布尔

    3. C if 语句始终允许使用指针作为其条件,以测试指针是否不可用 NULL (或 nil

    4. 什么时候 被添加到C标准中,它基本上被定义为“ 如果 “takes”,因此必须具有所有相同的行为,包括允许您在预期bool的位置提供一个指针,并让它进行计算 false 如果 , true

    5. 苹果无法改变 布尔 @encode()

    6. 当64位iOS出现时,许多数据类型已经改变了大小,所以苹果可以安全地进行更改 布尔 布尔 这是因为没有旧程序需要能够在与新库相同的内存空间中运行。一切都是新的。

    因此,在具有新定义的平台上 布尔 布尔 指针。在旧平台上, 布尔 签名字符 这显然不适合指针,并且没有指针的特殊调味汁,因此会导致警告。