49 votes

Objective-C - Lors de l'utilisation de 'soi'

C'est le code non modifié à partir de l'iPhone d'Apple de "l'Utilité Aplication" modèle:

- (void)applicationDidFinishLaunching:(UIApplication *)application {

 MainViewController *aController = [[MainViewController alloc] initWithNibName:@"MainView" bundle:nil];
 self.mainViewController = aController;
 [aController release];

 mainViewController.view.frame = [UIScreen mainScreen].applicationFrame;
 [window addSubview:[mainViewController view]];
 [window makeKeyAndVisible];

}

Lors de l' mainViewController est attribué à l' aController, self mot-clé est spécifié:

 self.mainViewController = aController;

Toutefois, lorsque l' mainViewController'image est réglée, l' self mot-clé n'est pas nécessaire:

 mainViewController.view.frame = [UIScreen mainScreen].applicationFrame;

Si je supprime l' self mot-clé dans le premier exemple, le programme se bloque avec le message:

objc[1296]: FREED(id): message view sent to freed object=0x3b122d0

Si j'ajoute l' self mot-clé pour le deuxième exemple, le programme s'exécute correctement.

Quelqu'un peut-il expliquer pourquoi self est nécessaire dans le premier cas, mais pas le second? Je suppose que dans les deux cas mainViewController est en se référant à la même variable d'instance.

49voto

Tobias Cohen Points 14390

À l'aide de soi les causes de votre classe "setter" pour cette variable à être appelé, plutôt que de changer le ivar directement.

self.mainViewController = aController;

est équivalent à:

[self setMainViewController:aController];

Sur l'autre main:

mainViewController = aController;

change juste l' mainViewController variable d'instance directement, sautant sur aucun code supplémentaire qui pourrait être intégré dans UIApplication de l' setMainViewController méthode, telles que l'abandon des vieux objets, de retenir de nouvelles, la mise à jour des variables internes et ainsi de suite.

Dans le cas où votre accès au cadre, vous êtes toujours à l'appel d'une méthode de définition:

mainViewController.view.frame = [UIScreen mainScreen].applicationFrame;

s'étend à:

[[mainViewController view] setFrame:[[UIScreen mainScreen] applicationFrame]];

Idéalement, l'avenir de votre code, vous devez également utiliser self.mainViewController (ou [self mainViewController]) lors de la récupération d'une valeur trop. En général, les cours sont beaucoup moins susceptibles d'avoir des code dans leurs méthodes "getter" que leur "poseurs", mais il est toujours possible d'accéder directement à risque de casser quelque chose dans une future version de Cocoa Touch.

11voto

Russo Points 192

l' self mot-clé indique que vous utilisez la propriété de lecture/définition au lieu d'accéder directement la valeur. dans le cas où vous laissez les getter/setter être auto-généré à l'aide de synchroniser, vous devez utiliser l'auto dans le premier exemple, parce que l'objet est conservé là, au lieu de simplement le pointeur attribué.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X