2008-12-19 66 views
3

我有一个对象 - 方法与此类似:赋值时将整数指针,未作演员

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

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

当我这样称呼它,我得到任何警告:

[self getUserDefaults:NO]; 

当我打电话它是这样的我得到一个警告:

[self getUserDefaults:YES]; 

警告:通过参数1'getUserDefaults:'使得指针从整数没有一个投

注:我总是调用该方法通过NO,然后再晚些时候我通过YES

任何人都可以填补我的问题是什么吗?谢谢。

回答

15

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

你应该让getUserDefaults取一个普通的BOOL,而不是一个指针。

5

我从来没有见过Obj-C代码,但我很确定这是因为'refreshDefaults'是一个指向BOOL的指针,而它应该是一个BOOL。

我不知道Obj-C中的键入规则,但它看起来像NO被定义为0,编译器没有问题将它转换为一个指针值(一个NULL指针)。那不会是整数'1'的情况。 (还要注意“if(refreshDefaults)”是检查针对NULL指针的指针refreshDefaults的有效代码)

1

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

17

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

-(void)getUserDefaults:(BOOL)refreshDefaults; 

代替。您得到警告的原因是0(这是NO被定义为的值)是没有强制转换的有效指针值,相当于NULL,但是1(这是YES定义的值)isn'没有强制转换的有效指针值。

+1

指向原语是完全合法的。 – 2008-12-19 03:43:51

+0

是的,但他没有传递BOOL指针,他只是传递BOOL,这就是为什么他会得到这个错误。 – dancavallaro 2008-12-19 03:47:34

3

很感谢!这是有道理的,并修复它!这里是更新的代码供参考:

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

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