Iphone 赋值从整数生成指针而不进行强制转换
我有一个类似于此的Obj-C方法: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
-(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)如果你想显示工作代码与非工作代码,你应该编辑你的原始问题;这不是一个论坛。第二,如果有人帮助你,你应该通过接受他们的回答来给他们荣誉:)