En Objective-C (ou C en général),
MyObject* myObject;
l'intérieur d'une mise en oeuvre du procédé ne pas initialiser myObject
avec unnil
. De même,
int a;
n'initialise pasa
avec 0. C'est ce que les gens qui ont décidé C il y a longtemps. Il y avait une raison historique pourquoi c'était ainsi.
initialize Tout explicitement comme
MyObject* myObject=nil;
Notez qu'une Ivar définie dans l'interface de classe est automatiquement réglé sur zero
avant init
est appelé.
Mise à jour: Notez également que myObject
est un pointeur à l'objet réel qui contient des données. Donc, si vous venez
MyObject* myObject;
cela signifie myObject
des points à un morceau de la mémoire des ordures, qui ne fonctionnerait pas correctement du tout.
MyObject* myObject=nil;
fait myObject
pour pointer vers rien. Maintenant, au moins, il ne fait rien du tout.Qu'est-ce que cette ligne
MyObject* myObject=[[MyObject alloc] init];
fait est d'allouer un objet MyObject
dans la mémoire, l'initialiser, puis faire le point myObject
à la partie de la mémoire correctement et initialisé. Maintenant, si le MyObject
a l'interface
@interface MyObject:NSObject {
NSString* string;
}
@end
et si vous définissez la méthode d'initialisation,
@implementation MyObject
-(id)init {
if(self=[super init]) {
... do something ...
}
return self;
}
après [super init]
est effectuée avec succès, garanties Objective-C que le Ivar string
est mis à nil
, à savoir string
points à rien. Mais ce n'est pas qu'un NSString
est alloué ou initialisé.
Merci à tous .. :) – stone
Attendez, alors il n'y a pas de point d'utiliser alloc lors de l'instanciation ... Je dois juste utiliser init. Puisque C lui alloue déjà de la mémoire. C'est abit foiré. N'est-ce pas? Je ne devrais pas avoir à utiliser nil lors de la déclaration – stone
Non, C n'alloue pas la mémoire. Voir la clarification que j'ai ajouté. – Yuji