7
votes

Conserver / libérer des objets retournés

Je suis nouveau à Objective-C, donc cela pourrait être une question stupide.

Je ne peux pas m'empêcher de voir les similitudes entre OBJC et Microsoft Chan en ce qui concerne la gestion de la mémoire ( addref / version vs Conserver / Libération ). Dans un environnement COM, il est plus ou moins imposé à vous à toujours addref ( retenir ) un objet avant de le renvoyer à l'appelant. D'après ce que j'ai vu jusqu'à présent (je suis un troisième à travers Programmation COCOA® pour Mac® OS X (3ème édition) ), la partie de gestion de la mémoire est quelque peu floue.

En supposant qu'il n'y a pas de gc, quelle est la manière idiomatique de retourner un objet?


0 commentaires

5 Réponses :


1
votes

Généralement quelque chose comme

retourner [Objet Autoréleuillet];

Et vous pouvez conserver à l'autre extrémité.

Si vous envisagez de déployer sur Lion / iOS5 ou utilisez le dernier SDK, consultez également ARC.


4 commentaires

Je viens de commencer à jouer avec Xcode et que je le fais comme un passe-temps, je ne vais donc rien déployer dans un avenir proche: d. Qu'est-ce que l'arc si je peux demander?


Est-ce la façon dont les Libs de cacao renvoient leurs objets en passant?


Arc = comptage automatique de référence. Avoir une étape de construction insère automatiquement de retenir / libération en fonction de modèles convenus.


Généralement, vous devriez retourner un objet Autorélied. Soyez prudent Calling Retour [Objet AutoRelease]; Comme je Rarement Structuring code comme celui-ci. Ne vous laissez pas simplement gifler aveuglément une autorelease sur votre valeur de retour; Lisez les directives de gestion de la mémoire et comprenez ce que vous faites.




-3
votes

Si vous retournez un objet, il appartient au propriétaire de le conserver, j'éviterais les autoraélases dans la mesure du possible, car une fois que le NSPOOL commence, ces objets sont partis et s'ils sont toujours utilisés, cela causera des problèmes.

I.e Réponse * Réponse = [Stackoverflow getanswer] et si la réponse a été créée dans la méthode getanswer, alors que ce qui est récupéré, il est responsable de la libération.

a du sens?


7 commentaires

Comment évitez-vous d'auto-libérer un objet que vous souhaitez revenir à votre appelant? Appelez-vous [Conserver] et faites-vous l'appelant le propriétaire (même si vous n'êtes pas appelé Alloc ou nouveau)? Ou ne conservez-vous pas l'objet du tout?


La grande majorité des procédés devraient renvoyer un objet autorélé. Le conseil "éviter les autoraélases dans la mesure du possible" est un mauvais conseil.


Je me tiens toujours à ce que j'ai dit, évitez de retourner des objets automatiques. Cela a été mentionné d'innombrables fois dans l'iPhone Design Guildelines. Par exemple, si vous retournez quelque chose de Coredata, vous ne venez que de retourner un objet autorélé. Cela restera en mémoire jusqu'à ce que la piscine commence et si vous ne le conservez pas correctement dans le propriétaire, vous obtiendrez des problèmes de mémoire et si vous êtes alors, vous avez un objet autorélé ne faisant rien ....


C'est un conseil affreux: c'est le contraire précis de tout code conventionnel de l'objectif-c / cacao.


Les lignes directrices Apple indiquent: Réduisez votre utilisation d'objets Autorélied. Les objets publiés à l'aide de la méthode Autoréleuillet restent en mémoire jusqu'à ce que vous égoutez explicitement la piscine Autoréleuillet actuelle ou jusqu'à la prochaine fois autour de votre boucle d'événement. Dans la mesure du possible, évitez d'utiliser la méthode Autoréleuillet lorsque vous pouvez utiliser la méthode de sortie pour récupérer la mémoire occupée par l'objet immédiatement. Si vous devez créer un nombre modéré d'objets AutoRélied, créez une piscine automatique locale et doutez-la périodiquement pour récupérer la mémoire de ces objets avant la prochaine boucle d'événement.


+1 kubi. @ user281300, vous manquez le point de ce très vieux fil ... qui a probablement disparu depuis la validité, étant donné l'arc. Mais, l'idée (cacao ou non) était que l'autorelease est une commodité de programmation pour aider les gens à ne pas oublier de libérer des choses qui vont être utilisées pour un peu. Apple essayait de vous aider à ne pas causer les problèmes que vous avez peur, si vous étiez dans une boucle serrée / grande, bloquez la piscine. :-)


Ouais mais mon point était, vous ne devriez pas simplement l'utiliser partout.



8
votes

Cocoa passe autour des limitations de addréf / (code> dans COM en introduisant un troisième frère; Autoréleuillet .

  • Conserver - J'en ai besoin de cela, faites-le rester.
  • version - Je n'ai plus besoin de cela, vous pouvez le supprimer immédiatement.
  • AutoRelease - Je n'ai pas besoin de cela, mais laissez-le rester quelques secondes au cas où quelqu'un d'autre veut la chercher d'abord.

    Ce minuscule addition permet de la plupart des valeurs de retour doivent être des poignées comme-si nous avons eu la collecte des ordures. Si vous n'êtes pas intéressé à garder la valeur de retour autour, ne faites rien de plus.

    Pour que cela fonctionne, il existe une convention (une convention suffisamment bonne pour que le compilateur fait la mémoire Stuff automatiquement pour vous avec l'arc à venir) :

    • Noms de méthode commençant par ces DOIVANT Retour Les instances conservées:
      • alloc
      • copie
      • nouveau
      • conserver
      • Tous les autres DOIVENT Renvoyer des instances automatiques de retour.

        trois exemples de mise en œuvre pour la manière dont cela peut être appliqué dans la pratique: xxx


0 commentaires

-1
votes

essentiellement, je vous recommanderais de faire la classe qui le reçoit la conserver. IE Class Stackoverflow reçoit une réponse d'objet.

IE P>

Answer *_answer = [stackoverflow createAnswer];
self.answer = _answer;
[_answer release];


8 commentaires

Une autre mauvaise réponse xD. Vous ne devriez pas publier des objets passés à votre méthode en tant que paramètre. Veuillez cesser de poster des réponses comme celles-ci pour éviter les débutants déroutants.


S'il vous plaît expliquer pourquoi vous ne pouvez pas la relever ici comme dans quels sont les problèmes que vous pourriez rencontrer. Éclaire-moi.


Vous êtes seul censé libérer des objets que vous créez. Les paramètres passés à votre méthode ne sont pas créés dans votre méthode, vous ne devriez donc pas les libérer. Cela permettra à un "message envoyé à une instance de distribution" au moment où l'appelant de votre méthode libère (ou envoie un message à) le paramètre qu'il vous a envoyé.


Mais Self.Answer est en train de les cogner de 1, puis de la libérer si essentiellement, cette classe devient le propriétaire + 1 puisque l'expéditeur avait déjà un +1 là-bas.


Cela n'a pas d'importance, c'est un article différent. Le problème est dans le paramètre que vous libérez que vous ne devriez pas. Lisez à nouveau le Guide de gestion de la mémoire. Il y a beaucoup de choses que vous devez comprendre. développeur.apple.com/library/mac / # documentation / cacao / concept ual / ...


Je comprends ce que vous dites, mais je ne suis toujours pas d'accord avec Autoréleuillant tous les objets que vous créez dans une méthode de retour Celles-ci devraient être publiés par le propriétaire. C'est-à-dire que vous revenez i.e un objet Altealice, qui ne devrait pas être retourné comme autorelé. Il devrait soit être retenu par le propriétaire puis libéré. Vous ne pouvez pas dépendre de la piscine Autoréleuillet pour lancer.


@Altealice a laissez-nous Continuez cette discussion en chat


Je suis toujours perplexe pour voir que tout le monde renvoie des objets retournés par l'ajustement. Juste vraiment perplexe. J'utilise rarement des objets automatiques.