2010-08-05 7 views
1

J'attribue un NSArray dans viewDidLoad (d'abord, est-ce que ça marche, comme c'est bon pratique?) Mais où puis-je le libérer? Dans ViewDidUnload, dealloc ou didRecieveMemoryWarning?Gestion de la mémoire et viewDidLoad (iphone, objectif-c)

(dois-je aussi un message à libérer, ou le mettre à zéro, ou vider le tableau ou une combinaison?)

Répondre

0

Vous pouvez attribuer à viewDidLoad, et il .L'appel sur chaque point quand il est dealloced (il appelle retenez lorsque vous les ajoutez, alors assurez-vous de le libérer si nécessaire).

Si vous n'en avez pas besoin, vous devez le libérer dès que possible. Si vous voulez vous en tenir (parce que c'est un cache), vous pouvez le libérer dans les trois cas, mais ne le relâchez pas plus d'une fois.

0

Pour libérer un objet, envoyer un message de sortie:

[myObject release]; 

Voir Properties in dealloc: release then set to nil? or simply release pour plus de détails.

Il n'est pas nécessaire de vider la baie. Lorsque le compte de référence sur le tableau tombe à zéro, il appellera [release d'objet] sur tous ses objets.

+0

Je sais comment libérer un objet. Je demande où. –

+0

Je répondais à la deuxième partie de notre question, à propos de la façon correcte de libérer un objet ([obj release], self.obj = nil, ...). mvds a répondu avec précision à la première partie. –

1

Vous devez affecter NSArray à une propriété conservée de self et (auto) la libérer dans viewDidLoad. Puis relâchez-le en dealloc. Dans cette configuration, lorsque viewDidLoad est appelé, il libère le NSArray "en cours", le cas échéant. Mais il semble que vous feriez mieux d'allouer NSArray dans l'une des fonctions init, si possible.

+0

Mais si je le libère automatiquement et le libère dans dealloc, ne le relâchera-t-il pas deux fois? Et provoquer une erreur, car il essaie de libérer un objet qui n'existe pas. –

+0

Oui, mais vous voulez qu'il soit publié deux fois: la première fois parce que vous l'obtenez avec un nombre de retenue de un depuis le début, et la seconde fois parce que votre objet s'y accroche parce que vous l'avez affecté à une propriété conservée. C'est à dire. en faisant 'self.prop = [obj autorelease]' vous transférez effectivement la propriété de la fonction à l'objet. – mvds

Questions connexes