11
votes

Si vous avez une iboutlet, mais pas une propriété, n'est-elle pas conservée ou non?

Je trouve la documentation sur cette question peu claire:

Dites que vous travaillez avec iOS (pas le cas Mac, pas besoin de mentionner les différences). Dire qu'il est strictement 4.0+ (pas besoin de différences mention dans l'ancien OS). Disons que nous chargeons le NIB strictement automatiquement.

Disons que vous avez un UIViewController, BigView. Dites il y a une douzaine de soi-disant éléments « de haut niveau » dans le fichier NIB ... pourrait être des contrôles personnalisés, des images, ou quoi que ce soit d'autre.

Dites que vous allez certainement créer explicitement et se débarrasser de BigView un certain nombre de fois au cours de la course de l'application. Donc:

Pour un de ces éléments de haut niveau dans le NIB, il y a trois possibilités :

(1) Vous n'avez pas une sorte de IBOutlet pour elle, du tout.

(2) Vous avez un connecté IBOutlet -. Mais pas une propriété

(3) Vous avez une propriété IBOutlet connecté (à confusion éviter, nous allons dire retain la propriété).

Alors qu'est-ce qui se passe à l'élément lorsque BigView est libéré?

Dans le cas de (3) il semble clair que vous devez libérer explicitement. Si vous ne le faites pas, il se bloque autour après la vue est parti. Pas de problème.

Dans le cas de (1) Je suppose ( mais peut-on réellement confirmer? ) que l'article sera disponible quand BigView est parti.

Dans le cas de (2) il est pas clair ce qui se passe .......

Axé sur le lien de référence bien connu: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html il est très douteux:

"Dans iOS, le code nib chargement utilise le setValue: forKey: méthode pour reconnectez chaque sortie Cette méthode semble même pour une méthode accesseur appropriée et [SO WHAT T-IL SI UN PAS IL EST ?? PARLEZ-NOUS APPLE.. ..] retombe sur d'autres moyens en cas d'échec ... [Good Grief!] "

Et vérifier cette documentation: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html et faites défiler jusqu'à "Nib rétention d'objets"

...

"Les objets dans le fichier nib sont créés avec un retain compter de 1, puis autoreleased" Fantastique ..

Mais attendez! Lisez la suite quelques mots ...

cependant, ... qui utilise la méthode de définition disponibles ou conserve l'objet par défaut si aucune méthode setter est disponible

Que font-ils parlent?

signifient-ils que si aucun setter est disponible (Ivar, mais pas de propriété), qu'il est NOUVEAU RÉPARTIS (autre que le « conservent », ils mentionnent que la clause précédente) --- ou sont-ils simplement se répéter, à savoir le « conserve l'objet par défaut » est le même « conservent » ils parlaient immédiatement précédemment ( « créé avec un retain compter de 1 et autoreleased »).

Et pourquoi ils mentionnent même le autorelease si ce n'est pas ce qui se passe?

En effet -? Si quelqu'un sait réellement plus précisément la réponse à cette question ...... comment savez-vous Avez-vous demandé DTS, ou par le biais d'essais, ou? Je suggère, la documentation clé (juste collé dans) est agressivement peu claire.

Encore une fois - si vous avez un IBOutlet, mais pas une propriété , connecté à un « haut niveau » objet .. êtes-vous responsable de la libérer? Est-il retenu? dans cette situation?

Pour cette question .... simplement dans la situation (1) est absolument le cas que le bidule sera libéré lorsque BigView disparaît? Je suppose que certainement c'est le cas, mais qui sait?

La question est ce qui se passe si vous utilisez un IBOutlet iVar, mais pas une propriété ...

J'ai bêtement jamais pensé à cela avant / pris trop, ce que quelqu'un a la réponse décisive? Vive !!


Pour le compte rendu, je l'ai fait un projet de test.

En fait (surprise pour moi) le simple fait de connecter un élément IB à un IBOutlet ajoute en fait apparemment un conserver .

(je ne peux que supposer du docu de mauvaise qualité, dans cette situation, vous obtenez précisément:. Conservez, Autorelease, Fidéliser - conduisant à un équilibre retain)

Alors, qui est la réponse.

Je vais poster le projet de démonstration. Je dirige également les lecteurs à la réponse de Jonas ci-dessous qui explique parfaitement le comportement de setValue: forKey: Vive


2 commentaires

Merci beaucoup. Je me demandais exactement les mêmes questions! J'étais tellement confus après avoir lu Apple Docs alors j'étais complètement incertain de quoi croire. Et aussi grâce à Jona pour cette clarification.


C'est un bizarre huh - je suis d'accord avec toi. Merci pour le haut vote comme celui-ci m'a donné un "pouvoir super-être" ou quelque chose sur ce site !!! Je suis le roi du monde !!!


3 Réponses :


2
votes

C'est une question intéressante, mais parce que la documentation est ambiguë, je pense que le meilleur plan (et celui que je crois est recommandé par Apple) est de faire conserver tous vos points de vente. Vous savez exactement ce qui se passe dans ce cas, et il y a peu de raisons de faire autre chose.


5 commentaires

Je n'ai pas DV, mais il vous suffit sûrement de faire quelque chose d'un point de vente si IB a besoin de le voir et uniquement une propriété si vous voulez des getters / setters?


Si vous avez besoin d'un point de vente, c'est parce que vous envisagez de conserver une référence à quelque chose créé à partir d'un fichier NIB. En utilisant une propriété pour gérer cette référence évite les types de questions soulevées ci-dessus et facilite également la gestion de la mémoire. Bien sûr, vous pouvez utiliser un ivar directement, mais c'est vrai de toute propriété. Peut-être que vous voulez dire que vous n'utilisez peut-être qu'une propriété que lorsque vous avez l'intention d'objets autres que vous-même de modifier la valeur correspondante, mais c'est exactement ce qui se passe lorsque vous chargez des objets d'une nib.


@Joe souffle, je pense que c'est une question intéressante, mais comme des sujets comme celle-ci, ils ont tendance à confondre les débutants, je voulais mettre la meilleure solution pratique là-bas. Je sais que ce que j'ai posté n'est pas la réponse que vous recherchiez et si quelqu'un vote cette réponse pour cette raison pour cette raison.


Avez-vous vraiment une augmentation de la performance en utilisant des propriétés? J'avais l'impression que cela vous a donné un getter et un setter pour cette variable ... Je n'utilise jamais de propriété à moins que je l'ai aussi et que je n'ai jamais remarqué quelque chose de différent dans la performance (bien que je puisse me tromper). EDIT: OH Attendez, faites-vous des performances comme pour ne pas utiliser de propriété pour obtenir une performance légèrement plus rapide? Si oui, je comprends ça !! Et je fais aussi ça!


@Joe oui nous sommes sur la même page ici ... de mon expérience que je n'utilise que des propriétés quand j'en ai besoin car a) on m'a toujours appris à créer des getters et des setters en cas de besoin et b) que je ne peux pas être ardéré Pour chaque var!



0
votes

11
votes

Je ne vois pas ce qui cause autant de confusion, je pense que la documentation "NIB Object Retrait" explique exactement ce qui se passe. Érablions-le et traversons ce qui se passe:

Les objets dans le fichier NIB sont créés avec un nombre de retenue de 1, puis une autorité automatique. xxx


Comme il reconstruit la hiérarchie de l'objet, toutefois, Uikit rétablit les connexions entre les objets à l'aide de SetValue: Forey: Méthode, xxx


Qui utilise la méthode de setter disponible ou conserve l'objet par défaut si aucune méthode de setter n'est disponible.

Comportement par défaut de -SetValue: Forey: dans iOS est grossièrement xxx

Voir le Guide de programmation de la valeur clé pour encore plus de détails. À moins que votre objet d'objet propriétaire de votre fichier ne remplace -sevalue: Forey: (ou + accessinstanceVariablesDirectement et -SetValue: Forundefinedkey: ) Attendez-vous à gérer l'objet de la gestion de l'objet. dessus.


Si vous définissez des points de vente pour des objets NIB-FILE, vous devez toujours définir une méthode de setter (ou une propriété déclarée) pour accéder à cette prise. Les méthodes de réglage pour les sorties devraient conserver leurs valeurs et les méthodes de réglage pour les points de vente contenant des objets de niveau supérieur doivent conserver leurs valeurs pour les empêcher d'être distribués.

Autoriser le chargement de la nib à définir IVAR directement sur des objets conservés de l'extérieurement à des objets conservés. Ne fais pas ça. Fournissez des méthodes de réglage pour vos points de vente afin que la propriété de l'objet chargé soit claire.


Si vous ne stockez pas les objets de niveau supérieur dans les points de vente, vous devez conserver soit le tableau renvoyé par le propriétaire Loadnibnamed: Propriétaire: Options: méthode ou les objets à l'intérieur du tableau pour éviter que ces objets ne soient libérés prématurément.

Les objets non connectés aux points de vente ont été autorélichés. Conservez-les ou le tableau renvoyé de -Loardnibnamed: Propriétaire: Options: Si vous allez essayer d'y accéder plus tard.


1 commentaires

Hey Joneh - En bref, c'est une magnifique explication de SetValue: Forey: Comportement, merci. (Le doco. Est mal parfaitement imparfait alors que je décris longuement ... sans vous, nous serions bourrés.)