2008-12-19 65 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]; 
} 
}