赋值使得指针在没有强制转换的情况下从整数开始

时间:2008-12-19 03:26:40

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

我有类似的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

任何人都可以告诉我这里的问题是什么吗?感谢。

5 个答案:

答案 0 :(得分:17)

BOOL是基本类型,而不是类,因此您的方法声明应为

-(void)getUserDefaults:(BOOL)refreshDefaults;

代替。您收到警告的原因是0(这是NO被定义为的)是没有强制转换的有效指针值,等同于NULL,但{ {1}}(这是1被定义为的)不是没有强制转换的有效指针值。

答案 1 :(得分:15)

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

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

答案 2 :(得分:5)

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

我不知道Obj-C中的输入规则,但看起来NO定义为0并且编译器将其转换为指针值(NULL指针)没有问题。不会是这种情况整数'1'。 (另请注意“if(refreshDefaults)”是检查指针refreshDefaults对NULL指针的有效代码)

答案 3 :(得分:3)

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

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

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

答案 4 :(得分:1)

在第一种情况下,NO可能默认为0 - 空指针。这是一个有效的Bool *。是默认为1,所以当它被强制转换为Bool *时,你传入整数1 - 然后变成Bool *。