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:
- 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.
- 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.
- De l'extérieur de la classe mise en œuvre par ex.
myClass.propertyName
appelle les méthodes d'accesseur getter/setter .