Appelle une méthode sur super prise en charge dans la mise en oeuvre d'un bloc Objective-C?Appeler super dans l'implémentation d'un bloc Objective-C
Quand j'appelle une méthode sur super un EXC_BAD_ACCESS erreur serait, mais dès que je l'ai changé ces appels de [super methodToCall]
à [self methodToCall]
et laisser le message déplacer la chaîne de répondeur il a bien fonctionné.
Il n'y a aucune implémentation de -methodToCall
dans l'instance de la classe dans laquelle le bloc existe, mais il y en a une dans la superclasse (c'est-à-dire la classe dont elle hérite). Je suis juste curieux d'apprendre les détails sur pourquoi appeler une méthode sur super dans l'implémentation d'un bloc a été un problème en premier lieu (techniquement) afin que je puisse l'éviter à l'avenir. Je soupçonne que c'est lié à la façon dont les variables sont capturées dans le bloc et quelque chose à propos de la pile et du tas, mais je n'ai vraiment aucune idée concrète.
Remarque: le code d'implémentation de bloc est appelé jusqu'à quelques secondes après le stockage du bloc dans une propriété. La propriété utilise copy. Je ne pense donc pas que le cycle de vie du bloc pose problème. être bien. De plus, cela ne faisait que planter sur l'iPhone (3G) mais fonctionnait sans crash dans le simulateur de l'iPhone.
Résultats dans EXC_BAD_ACCESS
:
[self retrieveItemsForId:idString completionHandler:^(NSError *error) {
if (!error) {
[super didRetrieveItems];
} else {
[super errorRetrievingItems];
}
}];
fonctionne parfaitement, les implémentations de -didRetrieveItems
et -errorRetrievingItems
sont dans la super-classe.
[self retrieveItemsForId:idString completionHandler:^(NSError *error) {
if (!error) {
[self didRetrieveItems];
} else {
[self errorRetrievingItems];
}
}];
Merci pour votre explication détaillée, j'apprécie! – Andrew
Pas de problème. C'est certainement une question intéressante qui ne m'était pas venue à l'esprit auparavant. –