2010-07-22 5 views
3

Je veux poser une question stupide sur l'application iPhone. Je suis le vert de l'application iPhone. J'ai lu le code suivant sur le site d'Apple.Que signifie «libérer» dans cette situation sur iPhone?

MyViewController *aViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]]; 
    [self setMyViewController:aViewController]; 
    [aViewController release]; 

Et j'ai une question, comment cela signifie de la «libération» dans la ligne 3?

La mémoire est-elle claire? ou le programme prend le contrôle de cet objet? ou d'autres significations. Merci beaucoup.

Répondre

5

Lorsque vous alloc quelque chose, l'objet que vous obtenez aura un nombre de retenue de 1 - cela signifie que cet objet est actuellement utilisé par quelqu'un, donc il ne devrait pas être retiré de la mémoire. Si vous appelez retain sur un objet, cela augmentera le nombre de retenues, ce qui signifie que l'objet est utilisé par 2 choses. Si le nombre de retenues atteint 0, cela implique que l'objet n'est plus utilisé par rien et peut être retiré de la mémoire. Vous pouvez réduire le nombre de retenues d'un objet en appelant le release sur l'objet.

Dans votre exemple, aViewController est alloc 'd et après la ligne 1 a un nombre de retenue de +1.

Il est ensuite défini en tant que contrôleur de vue dans la ligne 2. Cette méthode est donc la propriété de l'objet, il devrait donc retain pour son propre usage.

Ligne 3, nous ne voulons plus rien à voir avec le contrôleur de vue, donc nous le prenons en charge. Le nombre de retenues diminue de un - et il appartient maintenant au nouveau propriétaire de le libérer lorsqu'il en a fini avec lui.

Vous trouverez peut-être utile de lire dans la section de gestion de la mémoire de this tutrial

+0

Les comptes de conservation sont un détail d'implémentation. Oublie-les. Toute publication est un signal à l'exécution que vous avez abandonné votre intérêt pour l'objet. Le nombre de rétention est juste le chemin de suivi de l'exécution qui a un intérêt dans l'objet afin qu'il puisse être libéré quand personne ne le fait. – JeremyP

+0

Merci pour votre réponse. Qu'est-ce que 'call retient' sur un objet? Est-ce égal à la déclaration d'objet ou à l'initiation? Et si le nombre de retenue est 3, je dois appeler le [release] 3 fois? Et voulez-vous dire qu'après la ligne 1, le compte est 1, après la ligne 2, le compte est 2, et après la ligne 3, le compte revient à 1? Si oui, qui est le propriétaire ou l'utilisateur de cet objet? Je vous remercie. – Questions

2

Chaque fois que vous appelez alloc, vous possédez une référence à l'objet qui revient, et vous devez appeler release pour indiquer que vous ne l'intention d'utiliser cette référence.

Dans le cas ci-dessus, vous avez affecté un nouveau contrôleur de vue et vous l'avez affecté à une propriété de votre classe. En supposant que la propriété est déclarée avec l'option retain, la propriété va acquérir sa propre référence au contrôleur de vue en l'appelant retain. Donc, il y a maintenant deux références actives à cela. La propriété finira par libérer sa référence (soit quand un contrôleur de vue différent est affecté, soit lorsque votre classe est finalisée). Mais si vous n'appelez pas release vous-même, une référence restera, et le contrôleur de vue ne sera jamais libéré. En bref, vous devez faire correspondre chaque alloc avec une version, sinon cela risque de fuir.

+0

Merci de votre réponse. Est-ce que c'est la même chose que la fonction dans le decalloc? – Questions

+0

Non, -release décrémente uniquement le nombre de rétention de l'objet et appelle -dealloc lorsqu'il atteint zéro. -dealloc est la méthode par laquelle vous libérez vos variables d'instance et par ailleurs libérez les ressources appartenant à l'objet. – Costique