Deinit pas appelé sur un UIViewController, mais Dealloc est

Il semble que le Swift équivalent de dealloc deinit. Toutefois, lorsque vous tentez de définir la méthode sur un UIViewController, il ne se comporte pas comme vous le souhaiteriez...

Installation

  1. Créer une nouvelle Vue Unique du projet à l'aide de Xcode 7.0, soit Swift ou Objective-C.
  2. Ajouter un "rejeter" sur le bouton de vue-contrôleur qui a été créé avec le storyboard (je vais reporter ce point de vue, le contrôleur de VC2; sa classe est ViewController).
  3. Ajouter une nouvelle vue-contrôleur et mis à la vue initiale de contrôleur (VC1, la classe est nul).
  4. Ajouter un "cadeau" pour VC1 avec un "cadeau Modal" segue à VC2.
  5. Dans VC2 code, à mettre un point d'arrêt dans deinit (Swift) ou dealloc (Objective-C).
  6. Dans VC2, faire "disparaître" le bouton de action du procédez de la manière suivante:
    //Swift:
    presentingViewController?.dismissViewControllerAnimated(true, completion: nil)
    
    //Objective-C:
    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
  7. Exécuter l'application et appuyez sur les deux boutons pour présenter VC2 et puis la rejeter.

Remarquez comment dans Objective-C, la dealloc point d'arrêt est atteint.

Dans Swift, d'autre part, la deinit point d'arrêt n'est jamais atteint.

Pourquoi est deinit jamais appelé? Est-ce un bug ou pas?

Si c'est par la conception, où dois-je nettoyer le code de libérer des ressources lorsque le contrôleur ne sera plus nécessaire? (Il ne peut pas être dans viewDidUnload depuis cette méthode est obsolète. Il ne peut pas être dans viewDidDisappear parce que quelque chose d'autre pourrait être la tenue d'une référence à elle et finira par se montrer à nouveau.)


Remarque: Si vous tentez de définir une dealloc méthode rapide, vous obtenez l'erreur suivante:

Méthode dealloc()' avec Objective-C sélecteur 'dealloc conflits avec deinitializer avec le même Objectif-C sélecteur.

Si vous avez le point de vue de Swift contrôleur hérite de l'Objective-C contrôleur, et vous mettez un point d'arrêt dans l'Objective-C dealloc méthode, vous obtiendrez le même buggy comportement défini ci-dessus: le deinit ne sera pas appelé, mais le dealloc sera appelée.

Si vous tentez d'utiliser les Allocations pour afficher le nombre d'instances de la classe dans la mémoire, les deux versions montrent la même chose: La # Persistent est toujours 1, et la # Transient augmente à chaque fois que vous vous montrez le second point de vue du contrôleur.

Compte tenu de la configuration ci-dessus, il ne devrait pas être forte de cycle de référence tenant à la vue-contrôleur.

OriginalL'auteur Senseful | 2015-10-13