Il est dangereux de lancer des exceptions dans des circonstances où les ressources ne sont pas gérés automatiquement. C'est le cas de le Cacao cadre (et voisin des cadres), puisqu'ils utilisent le manuel de comptage de référence.
Si vous jeter une exception, tout release
appel vous passez par dépiler entraînera une fuite. Cela devrait limiter les vous tothrowing uniquement si vous êtes certain que vous n'allez pas récupérer depuis toutes les ressources sont retournés à l'OS lorsqu'un processus se termine.
Malheureusement, NSRunLoop
s ont tendance à attraper toutes les exceptions qui se propagent à eux, donc, si vous jetez lors d'un événement, vous pourrez reprendre pour le prochain événement. C'est, évidemment, très mauvais. Par conséquent, il est préférable que vous simplement de ne pas le jeter.
Ce problème est diminuée si vous utilisez le garbage collector Objective-C, comme toute ressource représentée par un Objectif-C objet sera bien libérée. Cependant, C ressources (telles que les descripteurs de fichiers ou d' malloc
-mémoire allouée) qui ne sont pas enveloppés dans un Objectif-C, l'objet sera toujours en fuite.
Donc, dans l'ensemble, de ne pas le jeter.
L'API Cocoa a plusieurs solutions de contournement pour cela, comme vous l'avez mentionné. De retour nil
et de la NSError**
modèle sont de deux d'entre eux.
Précisions pour l'ARC
ARC les utilisateurs peuvent choisir d'activer ou de désactiver de plein exception de sécurité. Lors de l'exception de sécurité est activé, l'ARC va générer du code pour la libération des références fortes lorsque leur portée est tué, ce qui le rend sûr à utiliser exception dans votre code. ARC aura pas de patch bibliothèques externes pour permettre à l'exception de soutien en eux, donc vous devez être prudent lorsque vous jeter (et surtout là où vous les attraper), même à l'exception de soutien activé dans votre programme.
ARC exception de soutien peut être activé avec -fobjc-arc-exceptions
ou désactivée avec -fno-objc-arc-exceptions
. Par défaut, il est désactivé en Objective-C, mais activé en Objective-C++.
Plein exception de sécurité en Objective-C est désactivée par défaut car le Bruit auteurs supposent que l'Objective-C programmes ne permettent pas de récupérer à partir d'une exception de toute façon, et parce qu'il est un grand de la taille du code de coûts et une petite perte de performance associés à ce nettoyage. En Objective-C++, d'autre part, le C++ introduit déjà beaucoup de nettoyage de code, et les gens sont beaucoup plus susceptibles de réellement besoin exception de sécurité.
C'est tout ce à partir de la spécification ARC sur le LLVM site web.