Il est possible que ces exemples utilisent le retain parce que le code de l'exemple alloue et initialise un UILabel de manière programmatique, puis l'ajoute à l'UIView. C'est le cas pour de nombreux exemples, car apprendre à utiliser Interface Builder n'est souvent pas leur but.
Le deuxième exemple (pas de propriété et pas de synthèse) avec l'IBOutlet est utilisé lorsque le développeur "assigne" l'UILabel (bouton, vue, etc.) dans l'Interface Builder -- en faisant glisser l'IBOulet vers l'étiquette ou un autre composant de vue. À mon avis, l'action précédente de glisser-déposer (Label sur la vue) ajoute également la sous-vue, le Label à une vue -- et ainsi de suite. L'étiquette est conservée par une vue ; une vue est conservée par la fenêtre ; la fenêtre est conservée par le propriétaire du fichier. Le propriétaire du fichier est généralement le document qui est démarré dans la fenêtre principale.
Vous remarquerez que lorsque vous passez à l'étape suivante de votre programme (en ajoutant un awakeFromNib
- (void)awakeFromNib
{
[fooLabel blahblah];
}
que fooLabel a déjà une adresse mémoire.
C'est parce que l'étiquette a été initialisée à partir d'un fichier groupé (le fichier nib) en utilisant non pas init mais initWithCoder. Ce qui a pour effet de désérialiser le flux de données vers un objet, puis de définir la variable IBOutlet. (Nous parlons toujours de la méthode IBOutlet).
Notez également que la méthode iOS mentionnée ci-dessus utilise la méthode Clé-Valeur
call [object setValue:outletValue forKey:@"<OutletName>"]
qui est le modèle Observer/Observable. Ce modèle exige que l'objet Observable fasse référence à chaque Observer dans un Set/Array. Un changement de valeur va itérer l'ensemble/le tableau et mettre à jour également tous les observateurs. Cet ensemble retiendra déjà chaque Observateur, d'où l'absence de retain dans iOS.
Plus loin et le reste n'est que spéculation.
Il semble que dans les cas où vous utilisez Interface Builder, alors
@property (nonatomic, retain) IBOutlet UILabel *fooLabel;
devrait éventuellement être modifié en
@property (nonatomic, weak) IBOutlet UILabel *fooLabel;
ou @property (nonatomic, assign) IBOutlet UILabel *fooLabel ;
Et il n'est pas nécessaire de le libérer dans une méthode dealloc. De plus, cela répondra aux exigences d'OSX et d'iOS.
C'est basé sur la logique et il se peut que je manque des éléments ici.
Néanmoins, il peut être indifférent que la vue soit persistante pendant toute la durée de vie de votre programme. Alors qu'une étiquette dans une boîte de dialogue modale (ouvrir, fermer, ouvrir, fermer) peut en fait être sur-réservée et fuir par cycle. Et c'est parce que (encore une spéculation) chaque boîte de dialogue fermée est sérialisée dans un système de fichiers et persiste donc la position x, y et la taille, ainsi que ses sous-vues, etc. Et ensuite désérialisée ... à l'ouverture de la session suivante (par opposition à minimiser ou cacher).