2010-10-12 4 views
0

J'ai un problème avec la libération d'une vue trop de fois. Bien que simple en théorie parce que je suis en train de me déplacer, ce qui est une sous-classe d'uiview et d'être animé et ainsi de suite, ce n'est pas quelque chose que je peux facilement corriger. Il se bloque seulement 10% et seulement dans certaines conditions et seulement 30% du temps même dans ces conditions.Libérer un objet en raison du nombre de retenues

Donc en d'autres termes c'est un peu complexe. Parfois, dans ma méthode dealloc, le nombre de retain de cet UIView est déjà 1 (qui est libéré lorsque la vue est libérée) et ne devrait donc pas être libéré à nouveau. Donc ce que je l'ai fait est la suivante:

if ([mainView retainCount] > 1) { 
    NSLog(@"released"); 
    [mainView release]; 
} 

Consistant avec les accidents libérés est généralement appelé, mais pas toujours et il arrive à peu près quand je me attends parfois de tomber en panne. J'ai vérifié les fuites avec ce code et il ne fuit jamais.

Maintenant la vraie question ... Est-ce mal de libérer quelque chose en raison de son nombre de retenue? J'ai essayé de nombreuses façons de résoudre ce problème et jusqu'à présent, c'est le seul qui soit fiable et qui ne fuit pas.

EDIT: Si non, alors quelle est la meilleure façon de copier un UIView dans un autre UIView?

mainView = newView; 
[newView release]; 

J'ai essayé de libérer la mainView d'abord, puis d'appeler la copie sur newView, mais cela se bloque. Ce qui précède fonctionne aussi parfaitement, sauf que le nombre de retenues est parfois inférieur à 1 attendu, même s'il n'est jamais sorti ailleurs dans le code.

Répondre

5

N'utilisez pas la valeur retainCount.

Sérieusement, vous devriez jamais utiliser cette valeur pour quelque chose de vraiment utile comme ça.

Si vous avez des fuites de mémoire, ou si vous rencontrez une panne due à des surcharges, corrigez-les - ce sont des bugs! Et ce n'est pas la façon de les gérer.

Edit: Toujours une bonne lecture: Memory Management Guide

+0

a mis à jour la question – Rudiger

+0

Vous devez afficher plus de code, et dites-nous ce que vous voulez vraiment faire. Copier une vue est en quelque sorte vague. – Eiko

+0

Il n'y a pas beaucoup plus. Il y a deux UIViews complexes, si j'ai besoin de créer une nouvelle vue complexe, je crée une UIView locale, crée le contenu de l'UIView, animée entre eux, obtiens mainView = newView puis libère newView. – Rudiger

0
mainView = newView; 

ce n'est pas une copie, mais une mission. Le retainCount ne sera pas augmenter. Ensuite, vous n'avez pas à faire une libération.

+0

C'est ce que je pensais, et c'est pourquoi j'ai essayé de copier. Mais ça plante. Le faire de cette façon ne fuit pas, fonctionne comme prévu et n'a généralement pas de problème de nombre de retenue. – Rudiger

+0

Vous n'avez pas besoin de copier la vue! –

1

N'utilisez pas -retainCount.

Le nombre absolu de rétention d'un objet n'a pas de sens.

Vous devez appeler release exactement le même nombre de fois que vous avez provoqué la conservation de l'objet. Pas moins (sauf si vous aimez les fuites) et, certainement, pas plus (sauf si vous aimez les accidents). Pour plus de détails, voir le Memory Management Guidelines.


Dans ce cas précis, un objet release ing lorsque vous ne l'avez pas conserver c'est une recette pour un désastre. S'il ne plante pas maintenant, il le sera un jour, peut-être en raison d'une mise à jour logicielle ou d'une modification apparemment sans rapport. Cela pourrait seulement fonctionner maintenant parce que votre gestion de mémoire est fausse partout ailleurs.

Comme l'a dit, ceci:

mainView = newView; 
[newView release]; 

ne fait pas une copie de la vue. Pire encore, il libère trop la vue (parce que vous ne la retenez nulle part). L'utilisation de la méthode copy sur les vues n'est pas la bonne solution ou, au moins, serait extrêmement atypique. Les éléments de l'interface utilisateur ne sont pas copiés de cette manière.

Avez-vous essayé build and analyze et corrigé les erreurs qu'il indique?

leaks peut ne rien afficher car il peut toujours y avoir un pointeur vers l'objet qui fuit flottant dans la mémoire accessible.

Questions connexes