Je viens de lire sur la façon d'échouer correctement dans une méthode init et les docs semblent être en désaccord les uns avec les autres. L'un recommande de lancer une exception tandis que les autres recommandent de nettoyer et de revenir à zéro. Quelle est la meilleure pratique actuelle ici?[self release], [self dealloc] ou [super dealloc] dans les méthodes init?
Répondre
Je crois que la pratique généralement acceptée est de retourner zéro en cas de défaillance. Mais vous ne voulez libérer l'auto pour éviter une fuite:
-(id)init
{
if (self = [super init]) {
...
if (thingsWentWrong) {
[self release];
return nil;
}
...
}
return self;
}
La méthode que j'ai toujours utilisée est le nettoyage et le retour de zéro. Les trois méthodes que vous mentionnez dans le titre de votre question peuvent entraîner des erreurs de segmentation plus élevées dans la hiérarchie des appels, alors que le retour nul ne le fera pas. Je crois que les docs d'Apple eux-mêmes disent de revenir en échec. Où trouvez-vous des divergences?
Le fait de renvoyer simplement zéro entraînera une fuite de mémoire, car l'appel à alloc aura créé un objet avec un nombre de rétention de un. –
La fuite de mémoire est ce que je veux éviter. – Kevin
Liens vers docs: détection d'erreur pendant l'initialisation - http://tr.im/mlyA La mise en œuvre d'un Initializer - http://tr.im/mlyX Vous remarquerez que, dans l'exemple de code dans le second lien ils recommandent de lancer une exception à la place. Je suis à peu près sûr que ce n'est pas la meilleure pratique actuelle. – Kevin
philosophie de cacao sur les exceptions est qu'ils ne doivent être jetés dans des situations programmeur erreurs, comme en passant un argument illégal d'une méthode. Si quelque chose d'autre ne va pas, la méthode devrait juste retourner NO ou nil, et nous espérons signaler les détails via un paramètre NSError ** "out".
Ceci inclut les méthodes -init. Si la situation d'erreur est quelque chose qui pourrait légitimement se produire dans le produit fini, alors la méthode devrait se libérer (pour éviter une fuite) et revenir à zéro.
Les bonnes solutions (exceptions et/ou [self release]; return nil;
) ayant été couvertes, j'aborderai les solutions incorrectes. Ne pas envoyer dealloc
directement. C'est le travail de release
. (Et si votre code fonctionne sous GC, dealloc
est inapplicable, et je ne pouvais que spéculer sur les problèmes que l'appel pourrait provoquer.)
Double-ne pas utiliser super
pour l'envoyer directement. Cela passerait votre propre implémentation dealloc
.
- 1. Comment libérer self (UIImageView) dans touchesEnded?
- 2. iPhone - sous-vue dealloc UIViewController lorsque removeFromSuperview
- 3. Pourquoi les rappels ActiveRecord requièrent-ils des variables d'instance ou des méthodes d'instance avec préfixe self?
- 4. Objectif des méthodes qui appellent seulement super?
- 5. (Ruby, Rails) Contexte de SELF dans les modules et bibliothèques ...?
- 6. Pourquoi vérifieriez-vous la présence de Assigned (self) dans les méthodes objet?
- 7. Dois-je libérer un IBOultet dans ma fonction dealloc?
- 8. Pourquoi "self" dans les objets Python est-il immuable?
- 9. Comportement de NSArray (et autres conteneurs) sur dealloc
- 10. Les méthodes locales agissent différemment lorsqu'elles sont appelées avec/sans self. Pourquoi?
- 11. iPhone - quand le dealloc pour un viewcontroller est-il appelé?
- 12. Iphone UIButton ne fonctionne pas dans UIViews imbriqués
- 13. Iphone UIButton ne fonctionne pas
- 14. Qu'est-ce que 'self' se réfère à @classmethod?
- 15. Impossible d'inclure "self" dans la méthode de description Objective-C?
- 16. Comment empêcher le 'self' de glisser-déposer dans un datagridview?
- 17. Différences entre ElementName = "<Me>" et RelativeSource self?
- 18. En utilisant $ this, self ::, parent :: pour la lisibilité du code
- 19. Quel est l'avantage d'avoir ce pointeur/self obligatoire?
- 20. Comment se conformer à un protocole self-made?
- 21. Comment créer OpenSolaris volume self bunle sur EC2
- 22. Comment utiliser la méthode self class sur iPhone? (Question conceptuelle)
- 23. Méthodes super classe en javascript
- 24. Share NSArray Contenu entre plusieurs méthodes dans une même classe
- 25. En javascript, comment rediriger vers SELF, avec une variable supplémentaire?
- 26. Que se passe-t-il exactement, lorsque je mets une propriété à zéro dans la méthode dealloc?
- 27. Pourquoi "copier" n'est pas invoqué?
- 28. Puis-je configurer le tableau de pneus ci-dessous en tant que NSArray?
- 29. Héritage ordre de libération?
- 30. La méthode -dealloc sera-t-elle appelée à la fermeture de l'application?
Merci pour les commentaires des gars. C'est ce que je faisais et je pensais être la bonne approche, mais les références aux deux autres méthodes dans les documents m'ont fait penser qu'il pourrait y avoir des cas particuliers à connaître. – Kevin