2010-09-24 9 views
0

Ok, j'ai créé ma propre classe (MyObject) le sous-classement NSObjectc, vérifier si l'objet est indéfini ou nul

puis dans mon code Je déclare ceci:

MyObject * myObject; 

Puis plus bas dans ma fonction , je fais:

if(myObject == nil) 
{ 
myObject = [self getObject]; 
} 

Mon instruction if renvoie false, que je veux que ce soit vrai. En mode débogage: il suffit de déclarer qu'il lui assigne une instance avec des valeurs aléatoires. Alors, dois-je remplacer la fonction init pour qu'elle renvoie nil, puis créer ma propre fonction initWith?

Répondre

5

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 pasaavec 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é.

+0

Merci à tous .. :) – stone

+0

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

+0

Non, C n'alloue pas la mémoire. Voir la clarification que j'ai ajouté. – Yuji

0

Assurez-vous que vous initialisez votre myObject à zéro comme ceci: -

MyObject * myObject = nul;

1

déclare MyObject être nul:

MyObject *myObject = nil; 

De cette façon, il ne fait rien.

Questions connexes