【问题标题】:Assignment Makes Pointer from Integer Without a Cast赋值从没有强制转换的整数中生成指针
【发布时间】:2008-12-19 03:26:40
【问题描述】:

我有一个类似这样的 Obj-C 方法:

-(void)getUserDefaults:(BOOL *)refreshDefaults
{
    PostAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

    if (refreshDefaults) {
        [appDelegate retrieveDefaults];
    }
}

当我这样称呼它时,我没有收到任何警告:

[self getUserDefaults:NO];

当我这样称呼它时,我会收到警告:

[self getUserDefaults:YES];

警告:传递 'getUserDefaults:' 的参数 1 使指针从整数而不进行强制转换

注意:我总是先调用传递 NO 的方法,然后稍后再传递 YES

谁能告诉我这里的问题是什么?谢谢。

【问题讨论】:

    标签: iphone c objective-c cocoa cocoa-touch


    【解决方案1】:

    BOOL 是原始类型,不是类,所以你的方法声明应该是

    -(void)getUserDefaults:(BOOL)refreshDefaults;
    

    相反。您收到警告的原因是 0(这是 NO 的定义)是一个没有强制转换的有效指针值,相当于 NULL,但 1(这是YES 被定义为) 不是没有强制转换的有效指针值。

    【讨论】:

    • 指向原语的指针是完全合法的。
    • 是的,但他没有传入指向 BOOL 的指针,他只是传入了一个 BOOL,这就是他收到该错误的原因。
    【解决方案2】:

    getUserDefaults 采用 BOOL*。传递 NO 时不会收到警告,因为 NO 为 0,0 为 NULL,这是一个合法的 BOOL*。 YES 为 1,相同的转换不会自动安全。

    您应该让 getUserDefaults 采用普通的 BOOL,而不是指针。

    【讨论】:

      【解决方案3】:

      我以前从未见过 Obj-C 代码,但我很确定这是因为“refreshDefaults”是一个指向 BOOL 的指针,而它应该是一个 BOOL。

      我不知道 Obj-C 中的打字规则,但看起来 NO 被定义为 0,编译器将其转换为指针值(NULL 指针)没有问题。情况并非如此整数“1”。 (另请注意“if (refreshDefaults)”是检查指针 refreshDefaults 与 NULL 指针的有效代码)

      【讨论】:

        【解决方案4】:

        谢谢!这是有道理的,并修复它!以下是更新后的代码供参考:

        -(void)getUserDefaults:(BOOL)refreshDefaults
        {
        PostAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
        
        if (refreshDefaults) {
            [appDelegate retrieveDefaults];
        }
        }
        

        【讨论】:

        • 几件快速的事情:1)如果你想显示工作代码与非工作代码,你应该编辑你的原始问题;这不是一个论坛。其次,如果有人帮助了你,你应该通过接受他们的回答来表扬他们:)
        【解决方案5】:

        在第一种情况下,NO 可能默认为 0 - 空指针。这是一个有效的 Bool*。 Yes 将默认为 1,因此当它转换为 Bool* 时,您将传入整数 1 - 然后将其转换为 Bool*。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-29
          • 2011-07-04
          • 2016-04-22
          • 1970-01-01
          相关资源
          最近更新 更多