Correct façon de régler une valeur BOOL propriété
J'ai un BOOL bien que je veux mettre dans ma classe initialiseur.
@property (assign, nonatomic) BOOL isEditMode;
- (id)init
{
. . .
[self setValue:NO forKey:isEditMode];
return self;
}
Le compilateur me donne une "Incompatible entier pointeur de la conversion d'avertissement". Ce que je fais mal?
OriginalL'auteur NSExplorer | 2011-12-12
Vous devez vous connecter pour publier un commentaire.
La Clé-Valeur de la méthode de Codage
setValue:forKey:
accepte uniquement les objets comme arguments. Pour définir un BOOL, vous avez besoin d'envelopper le numéro d'objet de valeur avec[NSNumber numberWithBool:NO]
. Mais il y a peu de raison de le faire. Key-Value Coding est une façon détournée pour accomplir cette tâche. Soit neself.isEditMode = NO
ou tout simplementisEditMode = NO
. Ce dernier est préférable à une méthode init (parce que les setters peut exécuter du code arbitraire qui pourrait ne pas être souhaitable avant d'un objet est entièrement mis en place).Mais de donner des précisions sur le premier point: La raison Clé-Valeur de Codage fonctionne de cette façon est parce que le type de système ne peut pas représenter un argument qui est parfois un objet et à d'autres moments, une valeur primitive. Donc KVC toujours concerne les objets et juste autoboxes valeurs primitives que nécessaire. De même, si vous ne
[yourObject valueForKey:@"isEditMode"]
, vous allez obtenir une NSNumber objet emballage de la valeur réelle.OriginalL'auteur Chuck
La bonne syntaxe pour définir une propriété est juste
Si vous souhaitez utiliser
-setValue:forKey:
vous devriez écrire commeCependant, il n'y a absolument aucune raison de le faire dans votre situation.
Cela dit, puisque vous êtes dans un
init
méthode, je ne saurais trop recommander d'éviter l'accès à la propriété que ce soit, et au lieu d'utiliser le ivar directement, comme dansCela évite la possibilité d'un substituée setter être appelé (soit dans cette classe ou sous-classe) qui fait l'hypothèse que l'objet a déjà terminé l'initialisation. Pour cette même raison, vous aussi, vous voulez éviter l'accès à la propriété à l'intérieur de
-dealloc
.OriginalL'auteur Lily Ballard
Vous pouvez simplement affecter directement la valeur:
setValue:forKey:
est une méthode de NSObject. Il sera valable pour n'importe quel objet de Cacao.quel est le problème avec l'aide de KVC dans l'établissement de la valeur BOOLÉENNE? Est KVC signifiait pour les objets?
Si vous utilisez KVC à la définir, la clé est une chaîne de caractères.
isEditMode
est le réel booléen ivar dans votre classe; ce que vous voulez est@"isEditMode"
, une chaîne de nommage que d'ivar.Ainsi, les valeurs de KVC sont toujours des objets, vous devez cocher une
BOOL
valeur dans unNSNumber
.Est-il une raison quelqu'un voudrait utiliser KVC dans la méthode init au lieu de définir les propriétés directement?
OriginalL'auteur Matt Lacey
Je pense que tu veux dire:
Si votre code n'est en effet compiler (je suis assez nouveau à Objective-C, donc je ne sais pas)
setValue
probablement prend un pointeur vers une chaîne de caractères (@"isEditMode"
, par exemple) et pas d'un autre type (isEditMode
, par exemple).OriginalL'auteur Ry-