2011-12-12 193 views
8

我有一個BOOL屬性,我想在我的類初始值設定項中設置。設置BOOL屬性的正確方法

@property (assign, nonatomic) BOOL isEditMode; 

- (id)init 
{ 
    . . . 
    [self setValue:NO forKey:isEditMode]; 
    return self; 
} 

編譯器給我一個「Incompatible integer to pointer conversion」警告。我在這裏做錯了什麼?

回答

16

鍵值編碼方法setValue:forKey:只接受對象作爲參數。要設置BOOL,您需要用[NSNumber numberWithBool:NO]將數字包裝在值對象中。但沒有理由這樣做。鍵值編碼是實現這一目標的一種迂迴方式。要麼self.isEditMode = NO或只是isEditMode = NO。後者在init方法中更可取(因爲setter可以在完全設置對象之前運行可能不需要的任意代碼)。

但是要詳細說明第一點:鍵值編碼以這種方式工作的原因是因爲類型系統不能表示有時是對象而有時是原始值的參數。所以KVC總是處理對象,並根據需要自動生成原始值。同樣,如果你做[yourObject valueForKey:@"isEditMode"],你會得到一個包裝真實值的NSNumber對象。

2

您只需直接分配值:我想你的意思

isEditMode = NO; 
+2

'setValue:forKey:'是NSObject的一個方法。它對任何Cocoa對象都有效。 – Chuck

+0

使用KVC設置BOOL值有什麼問題? KVC僅用於物體嗎? – NSExplorer

+3

如果您使用KVC進行設置,則密鑰爲字符串。 'isEditMode'是你班上實際的boolean ivar;你想要的是'@「isEditMode」',一個字符串命名伊娃。 –

2

self.isEditMode = NO; 

如果你的代碼確實編譯(我是很新,Objective-C的所以我不知道)setValue可能需要一個指向字符串(@"isEditMode",例如)而不是某種其他類型(例如isEditMode)的指針。

+0

二傳手可以工作,但沒有必要。 OP表示他希望在類初始化程序中設置該值,並且他沒有在其財產聲明中重新定義該設置程序。 – Jim

5

正確的語法設置一個屬性就是

self.isEditMode = NO; 

如果你想使用-setValue:forKey:你必須把它寫爲

[self setValue:[NSNumber numberWithBOOL:NO] forKey:@"isEditMode"]; 

但是,絕對沒有理由這樣做在你的情況。

這就是說,因爲你在init方法的時候,我會強烈建議避免任何屬性訪問任何和而不是直接使用的伊娃,在

isEditMode = NO; 

這避免了重寫二傳手的是可能性調用(在這個類或一個子類中),它假定對象已經完成了初始化。出於同樣的原因,您還希望避免-dealloc內部的財產訪問。