我有类似的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
任何人都可以告诉我这里的问题是什么吗?感谢。
答案 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 *。