6
votes

Pourquoi la vue UIViewController est-elle déchargée lorsqu'elle est visible?

Ce problème n'est jamais arrivé à moi. J'ai un UIViewController à l'intérieur d'une uoinavigationController. Lorsqu'un avertissement de mémoire est reçu (NEWLIND le niveau), la méthode ViewDiDunload du contrôleur visible est appelée, la vue est non chargée et je reçois un écran noir génial (avec une barre de navigation en haut).

Je teste avec un iPad 1 sur iOS 4.3.3.

Toute suggestion?


7 commentaires

Que ressemble la propriété "Vues" du contrôleur NAV lorsque vous obtenez cet avertissement (c'est-à-dire ce qui y est, l'ordre, etc.)? En outre, dans votre viewdiDunload, ajoutez le journal nslog (@ "fenêtre:% @", Self.View.window) "- Cela vous dira si la vue est visible.


Est-ce un "réel" avertissement ou celui que vous avez simulé?


David, c'est un vrai.


appelez-vous [super viewdidunload]; ?


Seulement sur votre contrôleur de vue enfant, pas le contrôleur NAV?


Oui, la vue déchargée est celle contenue dans le contrôleur NAV.


Votre hiérarchie de ViewController est-elle valide? Comment tous vos contrôleurs ont-ils été ajoutés à la racine?


3 Réponses :


0
votes

Selon Apple Directives de gestion de la mémoire lorsqu'un ViewController reçoit des avertissements de mémoire dans des situations critiques, il appelle directement ViewDidunload de sorte que la mémoire puisse être gérée par libérer la vue.

Son iOS en fait fournissant des chances de purger vos données temporaires qui seront utiles tout en recréant la vue. Etant donné que votre uiviewcotroller est la page racine de la liste du NavigationController Vous voyez la barre de navigation OLY La vue est déchargée.


2 commentaires

@emenegro Voir ceci LINK , SECTION" COMPRENDRE Comment les vues sont chargées et déchargées " gras Figure 4-2 Bold montre comment les vues sont déchargées lorsque la vueController reçoit une avertissement de mémoire. Aussi son explication au-dessus de la figure.


J'ai vu ces documents il y a longtemps et je ne vois nulle part où est la situation exceptionnelle en ce qu'une vue visible peut être déchargée. Ces documents expliquent comment une vue est déchargée et, C & P des étapes de déchargement du cycle: "Si la vue ne peut pas être libérée en toute sécurité (par exemple, elle est visible à l'écran) ...". Je veux donc savoir s'il est possible d'obtenir une vue déchargée tout en visible, dans ce cas étant dans une pile de navigation.



0
votes

Vous recevez ViewDidunload dans une situation de mémoire faible sur les contrôleurs, où IOS a déterminé que les vues ne sont plus nécessaires. N'oubliez pas que Apple a apporté des améliorations sur les implémentations sur les versions ultérieures d'IOS, il pourrait s'agir de voir ce qui se passe sous 5 xx. Deuxièmement, vous devriez revoir votre hiérarchie de contrôleur de vue.


0 commentaires

1
votes

De ce que je comprends, la méthode ViewDiDunload est appelée par didrecievememorywarning dans le uiviewcontroller (la super classe). Fondamentalement, IOS vous donne quelques avertissements et vous attendez à voir votre utilisation de la mémoire diminuer. Si vous continuez à ignorer ces éléments, OS tuera votre application.

Parfois, cependant, il est essentiel de garder des points de vue sur la manière dont je me contente de simplement remplacer la méthode didrecievememorywarning et à l'intérieur, ne faites rien.

ou mieux encore, vérifiez si auto est la vue actuelle dans le autoavigationController.VisibleViewController. / code>, et si oui, ne transmettez pas l'appel d'avertissement de la mémoire à [Super Didrecievememororywarning] .

Si vous détenez des caches d'image ou quelque chose, videz-les à la place.

htth


1 commentaires

Remarque rapide, iOS6 a changé ce comportement maintenant. UIViewController n'appelle pas automatiquement ViewDidunload sur un avertissement de mémoire par défaut. Il appelle simplement le didreceivememorywarning méthode et c'est tout. Seulement iOS6.