J'ai un contrôleur d'affichage qui possède une variable privée Je demande parce que d'autres méthodes de la vue ont besoin de cette variable et ne fonctionneront pas si c'est Merci! P> NSARRAY code>. La variable est initialisée dans la méthode code> ViewDidDload code>. Quelques questions surviennent pour le cas lorsque le
didreceivememorywarning code> est appelé: p>
nil code>? li>
nil code> dans quelle méthode doit-elle être recréée? Le contrôleur d'affichage appelle-t-il la méthode
ViewDidLoad CODE> pour le recréer? LI>
ol>
nil code>. p>
5 Réponses :
La méthode Si ce tableau est utilisé par différentes parties du code, vous devriez peut-être réfléchir à la refonte de votre structure de code afin d'éviter une concentration énorme de données à l'intérieur d'un seul objet. P>
ViewDidLoad code> est appelée une seule fois, lorsque votre mode de vue est initialisé. Si vous devez recharger certaines données à votre NSARRAY, vous devez appeler vos propres méthodes pour le faire en cas de besoin. P>
Non, la plage de visionnement est appelée lorsque le contrôleur d'affichage a chargé la vue, pas lorsqu'il est initialisé (méthode init). Cela semble une petite différence mais c'est très important parfois.
En outre, "une seule fois" n'est pas nécessairement vraie: les versions plus anciennes d'iOS peuvent décharger la vue sur les conditions de mémoire faible et par conséquent, appelez plus tard ViewDidDidLoad à nouveau. Cela expose l'importance différente entre l'initialisation du contrôleur d'affichage (qui n'est vraiment qu'une fois) par rapport à la vue chargée.
Vous avez raison, @OCMULUS ... Je pense que j'ai écrit à tort sur l'initialisation et le chargement ... Je vais ajouter une modification à résoudre
Plutôt que de garder des informations erronées dans le premier paragraphe, puis de la rétracter plus tard, pourquoi ne pas simplement corriger le premier paragraphe? Moins déroutant.
Il est préférable de définir votre variable à NIL. Je veux dire libérer la mémoire qu'il détient dans Vous pouvez toujours vérifier le drapeau sale dans le getter de Array (vous pouvez écrire le vôtre) et le repeupler. Ce n'est probablement pas le meilleur moyen. Cela dépend entièrement de l'utilisation de la matrice. P> didreceivememorywarning code> et définir un drapeau sale. P>
Donc, en théorie si je définis ma variable sur nil code> dans la méthode code> didreceivememorywarning code> Je devrai vérifier
nil code> et repeupler avant que j'essaie d'utiliser dans l'une de mes autres méthodes. Est-ce exact?
Ya. Vous ne voudriez pas accéder à un réseau NIL.
Down votant ?. N'importe quelle raison?.
Merci! Votre réponse était ce que je cherchais.
-1. Il n'y a pas besoin d'un drapeau "sale", vérifiez simplement nil code> dans la méthode getter.
@Jlehr, tableau peut être nul pour une autre raison aussi. Il ne sert à rien d'essayer de le repeupler, s'il n'est pas fait pour l'avertissement de la mémoire. C'est pourquoi j'ai mentionné entièrement dépend de l'utilisation. J'apprécie vos efforts pour corriger la réponse en passant,
@Occulus, il a répondu à la personne posée la question. Vous pouvez écrire une conférence complète à ce sujet, expliquant ce qui se passerait dans de nombreux autres scénarios. Ne pas faire cela ne justifie pas le vote négatif.
Il répond à la moitié de la question, sans donner une raison pour laquelle la réponse proposée est bonne et ignore toute une charge de nuances.
Cette question est très spécifique et ciblée. Il répond à ce qui a été demandé au point. Si vous parlez de nuances, il y a des centaines, peut-être plus. Vous ne pouvez pas donner un guide complet. Ce n'est pas l'intention non plus. Votre réponse parle de quelques bits supplémentaires. C'est tout. Si vous voulez donner des informations supplémentaires, je l'apprécie. Cela ne fait pas que ma réponse est incorrecte de toute façon.
Généralement, vous déchargez une propriété privée en attribuant un Le Par conséquent, vous ne pouvez pas simplement décharger des données arbitrairement lorsque vous recevez un appel à Le principe général est que Vous rechargez généralement les ressources en cochant qu'ils sont chargés lorsque vous en avez besoin, et sinon, les charger. P>
Il ne vaut pas la peine de nilier / de libérer de minuscules ressources telles qu'une seule chaîne normale de la taille. Vous devriez vous concentrer sur des articles en prenant des quantités importantes de mémoire. P>
Les progrès récents dans les coulisses La gestion de la mémoire signifie que vous êtes moins susceptible de non susceptible de décharger des données ces jours-ci - le système d'exploitation peut décharger et recharger des données d'image non compressées et similaire dans les coulisses. Strong> p>
Comme Licks chauds mentionne, le simulateur a une option permettant de simuler un avertissement de mémoire. Il convient de déclencher cet avertissement de mémoire à différents moments de votre application pour voir comment il se comporte. P> nil code> via le SETTER (E.G.
self.propertyname = nul code>). Ou vous pouvez définir l'ivar à nil après avoir appelé la version, par exemple
[_ version de la propriétéName]; _PropertyName = nul; code>, mais le premier est préférable. P>
didreceivememoryWarning code> est appelé lorsqu'il y a une faible situation de mémoire. Il est appelé sur chaque contrôleur d'affichage, y compris celui (s) responsable de l'interface utilisateur actuellement visible! P>
didreceivememorywarning code> - Le contrôleur d'affichage peut avoir besoin de ces données s'il est actuellement visible à l'écran. P>
didreceivememorywarning code> peut se débarrasser de toutes les ressources nécessaires pour aider à libérer la mémoire, mais seulement ceux qui ne sont pas immédiatement nécessaires. Par exemple, dans un jeu OpenGL, vous ne déchargeriez pas les textures qui sont actuellement visibles à l'écran. Cependant, voir mon dernier paragraphe. P>
J'ajouterai que le simulateur vous permet de simuler cet avertissement, de tester votre code de récupération de mémoire.
Apple recommande vivement d'utiliser le modèle d'initialisation paresseux pour recharger des ressources purgées. Ajout d'un bref exemple montrant comment faire cela améliorerait votre réponse.
Bravo des léches chaudes, ajouté que à ma réponse.
À titre d'exemple, j'ai eu une application qui a téléchargé des données sur une très longue vue table (potentiellement 1000 d'enregistrements). Pour soutenir cela, j'ai mis en place un tableau "clairsemé", permettant aux éléments vides qui seraient "défectueux" sur le net lorsqu'il est référencé (avec un indicateur "Téléchargement" dans la cellule du tableau lors du téléchargement). P>
Ceci a été truqué de sorte que lorsque DidreceivememoryWarning a eu lieu, le tableau serait purgé, en utilisant un algorithme au moins utilisé pour supprimer le plus ancien N% de la matrice. La récupération serait automatique - les cellules vidées se rechargeraient quand elles ont été référencées. P>
Non pas que je recommande ce schéma spécifique, mais notez les caractéristiques générales d'avoir beaucoup de données, de «hiérarchiser» ce qui devrait être supprimé et d'avoir un moyen «doux» pour recharger les données (idéalement uniquement recharger les pièces nécessaires dans un proche avenir). p>
Créer une getter personnalisée qui charge des données paresseusement. Quelque chose comme cet extrait est bon pour la non-muthreading Eviroment: de cette manière, les données sont toujours rechargées si vous "libérez" les avertissements de mémoire p> p> p> P> P> P> P> P> P> P> P> P> P> >
Pourquoi vous voulez mettre le nsarray * myarray;? Pourquoi cela appellera-t-il didreceivemememorywarning? Si c'est appelant, il est moyen qu'il y a un problème quelque part dans votre code, vous pouvez utiliser ARC
@arc DidreceivememoryWarning est appelé lorsqu'il y a une faible situation de mémoire. Cela ne signifie pas nécessairement qu'il y a un bogue dans son code. Le système pourrait simplement avoir beaucoup de choses.