J'ai converti mon application à l'ARC et a remarqué qu'un objet alloc ed dans l'une de mon point de vue, les contrôleurs n'était pas dealloc ed lors de ce point de vue contrôleur était dealloc ed. Il a fallu un certain temps à comprendre pourquoi. J'ai Activer Zombie Objets pour mon projet en cours de débogage et de ce qui s'est avéré être la cause. Considérons la suite de la logique d'application:
1) les Utilisateurs invoque l'action en RootViewController
qui provoque un SecondaryViewController
à être créé et présenté par presentModalViewController:animated
.
2) SecondaryViewController
contient un ActionsController
c'est un NSObject
sous-classe.
3) ActionsController
observe une notification par NSNotificationCenter
lorsqu'il est initialisé et s'arrête observe quand il est dealloc ed.
4) l'Utilisateur rejette SecondaryViewController
de retour à l' RootViewController
.
Avec Activer Zombie Objets éteint, le ci-dessus fonctionne très bien, tous les objets sont libérées. Avec Activer Zombie Objets sur ActionsController
n'est pas libérée, même si SecondaryViewController
est libéré.
Cela a causé des problèmes dans mon application b/c NSNotificationCenter
continue à envoyer des notifications à l' ActionsController
et les gestionnaires d'entraîner l'application crash.
J'ai créé une application simple pour illustrer ce à https://github.com/xjones/XJARCTestApp. Regardez le journal de la console avec Activer Zombie Objets on/off pour vérifier cela.
QUESTION(S)
- Est-ce comportement correct de l'Activer Zombie Objets?
- Comment dois-je mettre en œuvre ce type de logique pour éliminer le problème. Je voudrais continuer à utiliser Activer Zombie Objets.
EDIT #1: par Kevin suggestion, je l'ai soumis à Apple et à openradar http://openradar.appspot.com/10537635.
EDIT #2: précisions sur une bonne réponse
D'abord, je suis un développeur iOS expérimenté et je comprends parfaitement l'ARC, zombie objets, etc. Si je suis absent quelque chose, bien sûr, j'apprécie toute l'éclairage.
Ensuite, il est vrai qu'une solution de contournement pour ce crash est de supprimer actionsController
en tant qu'observateur lors de l' secondaryViewController
est libéré. J'ai trouvé aussi que si je définir explicitement actionsController = nil
lorsque secondaryViewController
est dealloc ed il sera dealloc ed. Ces deux ne sont pas grand contournement b/c, elles nécessitent l'utilisation de l'ARC mais le code que si vous n'êtes pas à l'aide de l'ARC (p. ex. néant iVars explicitement dans le dealloc). Une solution spécifique n'a pas également aider à identifier, si cela peut être un problème dans les autres contrôleurs de développeurs savent de façon déterministe quand/comment contourner ce problème.
Une bonne réponse serait d'expliquer comment la conception déterministe de savoir que vous besoin de faire quelque chose de spécial par rapport à un objet lors de l'utilisation de l'ARC + NSZombieEnabled de sorte qu'il permettrait de résoudre cet exemple précis et de s'appliquer de façon générale à un projet dans son ensemble, w/o en laissant le potentiel pour d'autres problèmes similaires.
Il est tout à fait possible qu'une bonne réponse n'existe pas car c'est peut être un bug dans XCode.
merci à tous!