2010-01-19 10 views
0

J'ai 1 NSString * abc = @ "Hardik"; J'ai un tableau NSMutableArray *; maintenant j'avais écrit [array addobject: abc];problème lié à NSString

alors je suis l'impression, NSLog (@ "array =% @", tableau);

mais je reçois NULL pourquoi? J'ai déclaré un tableau NSMutableArray *; dans le fichier a.h j'avais défini @property (nonatomic, retain) NSMutableArray * array; @synthesize array;

et j'ai synthétisent mais obtenir NULL valeur Je ne suis pas en mesure de le comprendre?

Répondre

3

On dirait que vous avez pas réellement alloué array. Généralement, vous le feriez dans votre initialiseur. (Ne pas oublier d'ajouter un release à votre méthode dealloc aussi.) @synthesize crée le getter et setter, mais vous devez toujours gérer l'allocation/désallocation l'objet vous-même.

4

Vous devez également initialiser votre tableau:

array = [[NSMutableArray alloc] initWithCapacity:10]; 

Ce sont des choses assez fondamental. Avez-vous déjà lu le "Learning Objective C Primer"?

0

Il semble que votre propriété de tableau NSMutableArray * n'a pas été initialisée? Pouvez-vous poster votre méthode d'init de classe?

0

Pour déclencher l'accesseur synthétisé au sein d'une classe elle-même, vous devez utiliser self. Si vous ne le faites pas, vous accédez directement à l'adresse de l'attribut sans passer par les méthodes d'accès. Vous avez besoin de:

NSString *abc = @"Hardik"; 
[self.array addobject:abc]; 
NSLog(@"array = %@", self.array); 

La raison pour laquelle ceci est important est que les méthodes synthétisées initialisent également la propriété. Les entrailles de la méthode de tableau de synthétisent ressemblerait à quelque chose comme:

-(NSArray *) array{ 
    if (array!=nil) { 
     return array; 
    } 
    array=[[NSMutableArray alloc] initWithCapacity:1]; 
    return array; 
} 

self.propertyName est vraiment juste un raccourci pour [self propertyName] et self.propertyName=someValue est juste un raccourci pour [self setPropertyName:someValue].

Jusqu'à ce que vous appelez self.array au moins une fois, la propriété tableau n'est pas initialisé. Cependant, juste pour confondre les choses, une fois que vous avez appelé self.array une fois qu'il est initialisé, vous pouvez simplement appeler directement array. Donc ...

[self.array addObject:abc]; 
NSLog(@"array = %@", array); 

... alors que l'inverse ne retournerait qu'un tableau vide.

Ainsi, les règles sont les suivantes:

  1. Au sein d'une implémentation de la classe (y compris les sous-classes), appelant simplement propertyName vous donne l'adresse de la propriété, mais ne remet pas les accesseurs getter/setter.
  2. Au sein d'une implémentation de la classe (y compris les sous-classes), en utilisant self.propertyName appelle les accesseurs getter/setter mais n'accède pas directement attribut.
  3. De l'extérieur de la classe mise en œuvre par ex. myClass.propertyName appelle les méthodes d'accesseur getter/setter .