Question

J'ai implémenté un peu de code à partir de l'un des nombreux exemples de code Apple, mais j'ai quelques problèmes, car l'attribut rétention de l'une des propriétés ne semble pas fonctionner. Voici la déclaration de propriété:

@property (nonatomic, retain) EditingViewController *editingViewController;

Et voici le code:

- (EditingViewController *)editingViewController {
    // Instantiate the editing view controller if necessary.
    if (editingViewController == nil) {
        EditingViewController *aController = [[EditingViewController alloc] init];
        editingViewController = aController;
        [aController release];
    }
    return editingViewController;
}

Je comprends que (conserver) est censé faire augmenter le nombre de retenues de 1 lors de l'affectation; Toutefois, le code échoue à moins que n'envoie l'envoyer moi-même ou que ne n'envoie pas [une version de Controler]. Qu'est-ce qui me manque ici?

Était-ce utile?

La solution

Lorsque vous faites référence à publishingViewController , cela équivaut à self- > montageViewController , c’est-à-dire un accès à un ivar.

Si vous souhaitez utiliser un getter ou un setter, vous devez utiliser self.editingViewController , ou de manière équivalente [self setEditingViewController: aController] . .

C'est pourquoi je préfère utiliser un ivar avec un nom différent pour la propriété, par exemple:

EditingViewController* i_editingViewController;

@property (nonatomic, retain) EditingViewController *editingViewController;

@synthesize editingViewController = i_editingViewController;

Ensuite, vous pouvez écrire votre getter paresseux comme suit:

- (EditingViewController *)editingViewController {
    // Instantiate the editing view controller if necessary.
    if (i_editingViewController == nil) {
        i_editingViewController = [[EditingViewController alloc] init];
    }
    return i_editingViewController;
}

ou

- (EditingViewController *)editingViewController {
    // Instantiate the editing view controller if necessary.
    if (i_editingViewController == nil) {
        EditingViewController *aController = [[EditingViewController alloc] init];
        self.editingViewController = aController;
        [aController release];
    }
    return i_editingViewController;
}

J'utiliserais probablement l'ancienne méthode (sans invoquer le séparateur) car la valeur de editViewController (vue par tout observateur) n'a pas vraiment changé, mais dans tous les cas, cela devrait fonctionner correctement et le nom différent (pour ivar et property) aident à éviter la confusion ou une utilisation abusive accidentelle. L’utilisation de cette propriété est également un léger encouragement (car elle évite le préfixe légèrement laid).

Notez qu'Apple réserve le préfixe _ et que les paramètres et les accesseurs ne doivent pas être utilisés dans les routines init / dealloc .

Autres conseils

Vous devez écrire self.editingViewController pour pouvoir utiliser la propriété. Il suffit de " editViewController " est un accès direct à la variable de membre de classe, alors que self.editingViewController est équivalent à [self setEditingViewController: ...] et effectue le travail de rétention / édition approprié.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top