2009-10-16 5 views
0

Est-il acceptable qu'une méthode d'instance d'une classe se libère elle-même?Est-il acceptable de libérer un objet dans une méthode de la classe de l'objet?

-à-dire d'avoir une méthode qui appelle:

[self release] 

On suppose que mon code ne va pas accéder à l'auto après avoir appelé [auto libération]

+1

Veuillez décrire plus en détail pourquoi vous le feriez. – nall

+1

Appuyé. Qu'est-ce que vous essayez d'accomplir ici? –

+0

J'ai trouvé ce qui est fondamentalement la même question: http://stackoverflow.com/questions/1385433/is-calling-self-release-allowed-to-control-object-lifetime Mon cas est similaire, un objet qui existe, effectue des appels Web, écrit sur sqlite et contrôle son propre cycle de vie. Par exemple, il reçoit un rappel de NSUrlConnection, il écrit dans sqlite, et c'est fait. Je suppose que le rappel pourrait être délégué à l'application, et il traite de la libération, mais j'ai aimé l'idée de l'encapsulation de la logique dans le cadre de cet objet. J'ai aimé l'une des suggestions d'utilisation autorelease au lieu de la libération. – Alan

Répondre

1

Est-il acceptable qu'une méthode d'instance d'une classe se libère elle-même?

-à-dire d'avoir une méthode qui appelle:

[self release]

On suppose que mon code ne va pas accéder à l'auto après avoir appelé [auto libération]

D'abord, je Je veux avoir une très bonne raison de me libérer. La seule fois où je l'ai fait est dans un singleton que je vide pour libérer de gros morceaux de mémoire sur un iPhone. C'est un événement rare.

Votre code fait partie de l'objet de classe. Par conséquent, ce n'est pas vraiment un problème d'appeler [auto-libération]. Bien sûr, vous êtes beaucoup plus sûr, du point de vue de l'encapsulation, si vous appelez [auto autorelease]. Au moins, si quelqu'un dans la chaîne d'appels appelle vos méthodes, vous ne provoquez pas d'exception.

Andrew

1

Bien que je doute que immédiatement après votre libération, la mémoire bougerait beaucoup, gardez à l'esprit que le code que votre [auto-release] est dans, réside dans un bloc de mémoire à l'intérieur de votre objet. Ainsi, il est possible qu'après retour de [auto-release], vous finissiez par avoir du code qui n'est plus alloué et qui est écrasé par un autre processus. Je ne peux pas dire avec certitude à quel point cela est probable, mais cela semble possible.

1

J'ai utilisé cette technique une fois auparavant, pour une situation similaire (la réponse autonome d'un délégué Web à un objet peut survivre à la vue qui a lancé la requête).

Cela fonctionne, mais est en fait plutôt difficile à obtenir. Depuis lors, j'ai trouvé que l'utilisation de NSOperations dans une NSOperationQueue est une approche beaucoup plus solide et bien comprise pour encapsuler des actions en arrière-plan qui s'exécutent indépendamment des demandeurs. Habituellement, lorsqu'une opération est effectuée, une notification est envoyée sur le thread principal, informant que l'appelant est toujours là et que les données sont prêtes à être récupérées. Plus pour les demandes distantes simples, vous pouvez utiliser les appels URL synchrones plus simples dans votre Opération car ils fonctionnent dans un thread séparé et ne bloquent pas le thread principal lorsque les données sont entrantes (utile pour extraire des petites images d'URL, par exemple) .

+0

Merci pour la réponse. En fait, j'ai d'abord écrit cela comme un fil, en utilisant une requête web synchrone dans le fil. Je voulais me débarrasser de la complexité des threads, et j'ai commencé à penser à utiliser cette nouvelle approche. – Alan

0

Vous pouvez le faire. Ça marche. C'est un peu dangereux, d'autant plus que l'optimisation des compilateurs peut réorganiser votre code d'une manière que vous n'aviez pas l'intention de le faire.Un peu plus sûr est d'appeler [auto autorelease], ce qui libérera l'objet actuel à un moment donné dans le futur proche (la prochaine fois à travers le runloop généralement) plutôt que tout de suite.

Questions connexes