Iphone 赋值从整数生成指针而不进行强制转换

Iphone 赋值从整数生成指针而不进行强制转换,iphone,c,objective-c,cocoa,cocoa-touch,Iphone,C,Objective C,Cocoa,Cocoa Touch,我有一个类似于此的Obj-C方法: -(void)getUserDefaults:(BOOL *)refreshDefaults { PostAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; if (refreshDefaults) { [appDelegate retrieveDefaults]; } } 当我这样称呼它时,我没有得到任何警告: [self

我有一个类似于此的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的方法


有人能告诉我这里有什么问题吗?谢谢。

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


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

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

Bool
是一种基本类型,而不是类,因此您的方法声明应该是

-(void)getUserDefaults:(BOOL)refreshDefaults;

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

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


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

很酷,谢谢!这是有道理的,并且解决了它!以下是更新后的代码供参考:

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

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

指向原语的指针是完全合法的。是的,但他并没有传递指向BOOL的指针,他只是传递了BOOL,这就是为什么他会出现错误。两件简单的事情:1)如果你想显示工作代码与非工作代码,你应该编辑你的原始问题;这不是一个论坛。第二,如果有人帮助你,你应该通过接受他们的回答来给他们荣誉:)