2011-12-12 23 views
8

Mam właściwość BOOL, którą chcę ustawić w inicjalizatorze klasy.Poprawny sposób ustawiania właściwości BOOL

@property (assign, nonatomic) BOOL isEditMode; 

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

Kompilator daje mi ostrzeżenie "Niezgodna liczba całkowita do konwersji wskaźnika". Co ja tu robię źle?

Odpowiedz

16

Metoda kodowania klucz-wartość setValue:forKey: akceptuje tylko obiekty jako argumenty. Aby ustawić BOOL, musisz zawinąć liczbę w obiekcie wartości za pomocą [NSNumber numberWithBool:NO]. Ale nie ma ku temu powodu. Kluczowe wartości Kodowanie jest okrężną drogą do osiągnięcia tego. Albo self.isEditMode = NO lub tylko isEditMode = NO. Ta druga metoda jest preferowana w metodzie init (ponieważ setery mogą uruchamiać dowolny kod, który może nie być pożądany, zanim obiekt zostanie w pełni skonfigurowany).

Ale opracowanie pierwszego punktu: Powodem tego jest kodowanie klucz-wartość działające w ten sposób, ponieważ system typów nie może reprezentować argumentu, który czasami jest obiektem, a innym razem wartością pierwotną. Więc KVC zawsze zajmuje się przedmiotami i po prostu wartościami prymitywnymi autoboxów, jeśli to konieczne. Podobnie, jeśli zrobisz [yourObject valueForKey:@"isEditMode"], otrzymasz z powrotem obiekt NSNumber zawijający prawdziwą wartość.

2

można tylko przypisać wartość bezpośrednio:

isEditMode = NO; 
+2

'setValue: forKey:' jest metodą NSObject. Będzie obowiązywać dla dowolnego obiektu Cocoa. – Chuck

+0

jaki jest problem z używaniem KVC przy ustawianiu wartości BOOL? Czy KVC jest przeznaczone tylko dla obiektów? – NSExplorer

+3

Jeśli używasz KVC do ustawienia, klucz jest ciągiem. 'isEditMode' jest faktycznym boolean ivar w twojej klasie; to co chcesz to '@" isEditMode "', ciąg nazywajacy to ivar. –

2

Chyba chodziło

self.isEditMode = NO; 

Jeśli Twój kod faktycznie kompilacji (Jestem całkiem nowy, Objective-C więc nie wiem) setValue prawdopodobnie bierze wskaźnik na ciąg (@"isEditMode", np.), a nie jakiś inny typ (isEditMode, np.).

+0

Seter zadziała, ale nie jest to konieczne. OP powiedział, że chce ustawić wartość w inicjatorze klasy i nie przedefiniował settera w swoim oświadczeniu własności. – Jim

5

Poprawna składnia ustawić właściwość jest tylko

self.isEditMode = NO; 

Jeśli chcesz użyć -setValue:forKey: trzeba by napisać go jako

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

Jednakże, nie ma absolutnie żadnego powodu, aby to zrobić w twojej sytuacji.

Powiedział, że skoro jesteś w metodzie init, gorąco polecam unikając jakiegokolwiek dostępu do własności i zamiast przy użyciu bezpośrednio ivar, jak w

isEditMode = NO; 

Eliminuje to możliwość wystąpienia zastąpionej seter istota call (w tej klasie lub podklasie), która zakłada, że ​​obiekt już zakończył inicjalizację. Z tego samego powodu chcesz również uniknąć dostępu do własności wewnątrz -dealloc.

Powiązane problemy