2010-04-11 5 views
0

Je l'ai fait de manière objective-C en arrière quand, et ont récemment (à savoir maintenant) lire la documentation sur le site d'Apple concernant l'utilisation de retain et release. Cependant, il y a un peu de code dans leur Creating an iPhone Application page qui m'a un peu confus:question de base sur conserver/sémantique de libération de la bibliothèque de référence d'Apple

- (void)setUpPlacardView 
{ 
    // Create the placard view -- it calculates its own frame based on its image. 
    PlacardView *aPlacardView = [[PlacardView alloc] init]; 
    self.placardView = aPlacardView; 
    [aPlacardView release]; // What effect does this have on self.placardView?! 
    placardView.center = self.center; 
    [self addSubview:placardView]; 
} 

Ne pas voir toute la classe, il semble que self.placardView est aussi un PlacardView * et l'affectation de celui-ci à aPlacardView ne semblent indiquer qu'il conservera une référence à celui-ci. Donc, il me semble que la ligne que j'ai commentée ([aPlacardView release];) pourrait avoir aPlacardView ayant un nombre de retenue de 0 et donc désalloué. Depuis self.placardView points, ne serait-ce pas maintenant à la mémoire désallouée et causer un problème?

Répondre

3

Je l'ai fait de manière objective-C en arrière quand,

Salut concept Obj-C a introduit un (mal) de propriétés dans l'intervalle. Notez que

self.placardView=xxx; 

et

self->placardView=xxx; 

est différent. Le premier, par définition, appelle [self setPlacardView:xxx] tandis que le dernier affecte simplement xxx dans un membre. Maintenant, quand vous regardez MoveMeView.h, vous voyez la ligne

@property (nonatomic, retain) PlacardView *placardView; 

et MoveMeView.m

@synthesize placardView; 

Ces dire au compilateur de générer -setPlacardView: et placardView de façon appropriée, en utilisant la norme conserver/sémantique de libération. Pour plus de détails, voir la documentation d'Apple pour properties.

+0

Le concept de propriétés n'est pas mauvais, c'est la notation par points qu'Apple a introduite en même temps. temps. Il pollue la syntaxe et provoque une confusion sans fin. Personnellement, j'utilise beaucoup les propriétés, mais j'utilise la syntaxe Objective-C normale pour les obtenir et les définir. – JeremyP

+0

Oui, je suis d'accord avec ça. C'est pourquoi j'ai mis des parenthèses autour du mot mal pour commencer. Pour moi, la notation par points est parfaitement OK; Je me rappelle toujours que ce sont des appels de méthodes. Mais je suis d'accord que c'est une grande source de confusion pour les débutants. – Yuji

1

Quelques points à signaler; La propriété placardView est définie comme étant conservée (@property (retain) ...) alors self.placardView appellera le setter généré par le compilateur, qui inclura un retain. Juste au cas où cela soit nouveau pour vous, les propriétés et le @synthesize associé indiquent au compilateur de générer les méthodes - (void)setPlacardView:(UIView *)view et - (UIView *)placardView.

Une autre chose à noter; addSubview: conserve la vue qui lui est donnée. Donc, sans la publication, la vue aurait un nombre de retenues de 2. Relâcher puis ajouter en sous-vue vous donne un nombre de retenue de 1.

Questions connexes