Ich habe eine BOOL-Eigenschaft, die ich in meinem Klasseninitialisierer festlegen möchte.
%Vor%Der Compiler gibt mir eine Warnung "Inkompatible Integer to Pointer-Konvertierung". Was mache ich hier falsch?
Die Schlüsselwertcodierungsmethode setValue:forKey:
akzeptiert nur Objekte als Argumente. Um einen BOOL zu setzen, müssen Sie die Zahl in ein Wertobjekt mit [NSNumber numberWithBool:NO]
umbrechen. Aber es gibt wenig Grund, das zu tun. Key-Value Coding ist ein Umweg, um dies zu erreichen. Entweder self.isEditMode = NO
oder nur isEditMode = NO
. Letzteres ist in einer init-Methode vorzuziehen (weil Setter beliebigen Code ausführen können, der möglicherweise nicht wünschenswert ist, bevor ein Objekt vollständig eingerichtet ist).
Aber um den ersten Punkt näher auszuführen: Der Grund, warum die Schlüsselwertcodierung so funktioniert, liegt darin, dass das Typsystem kein Argument darstellen kann, das manchmal ein Objekt und manchmal ein primitiver Wert ist. So behandelt KVC immer Objekte und autoboxiert einfach nur primitive Werte. Wenn Sie [yourObject valueForKey:@"isEditMode"]
ausführen, erhalten Sie ein NSNumber-Objekt, das den tatsächlichen Wert umschließt.
Die richtige Syntax zum Festlegen einer Eigenschaft ist nur
%Vor% Wenn Sie -setValue:forKey:
verwenden möchten, müssen Sie es als
Es gibt jedoch absolut keinen Grund, dies in Ihrer Situation zu tun.
Da Sie sich in einer init
-Methode befinden, würde ich dringend empfehlen, jeglichen Zugriff auf die Eigenschaften zu vermeiden und statt dessen den ivar direkt zu verwenden, wie in
Dies verhindert die Möglichkeit, dass ein überschriebener Setter (entweder in dieser Klasse oder einer Unterklasse) aufgerufen wird, der die Annahme voraussetzt, dass das Objekt die Initialisierung bereits abgeschlossen hat. Aus demselben Grund möchten Sie auch den Zugriff auf Eigenschaften innerhalb von -dealloc
vermeiden.
Tags und Links objective-c ios