2009-08-14 9 views
0

Si j'alloue et init un objet dans une méthode appelée assez fréquemment, et si je ne la libère pas immédiatement, l'objet devient-il un cauchemar de mémoire? Ou l'alloc et init seront-ils ignorés si l'objet est déjà en mémoire?Allocation de mémoire et bouclage

C'est un peu difficile pour moi d'expliquer, désolé!

Merci.

Répondre

1

Sans récupération de place, si l'objet en question n'est jamais libéré, il disparaît l'instance dans laquelle vous l'avez libéré. Même si l'objet est auto-libéré, vous pouvez créer votre propre autorelease pool et envelopper votre boucle avec elle.

Dans garbage collection, il est alors un peu plus difficile à prévoir, mais le garbage collector devrait faire un travail décent de la gestion des objets qui sont tous alloués près les uns des autres.

0

Sans savoir ce que vous faites exactement, il est difficile de dire, mais il semble que vous faites:

for (...) 
    [[Foo alloc] init]; 

Dans ce cas, vous leak, comme si vous avez

for (...) 
    malloc(...) 

ou

for (...) 
    new ...; 

Si vous êtes dans un environnement de GC ce n'est pas un problème (en Obj-C 2, avec GC a permis de retenir/relea se n'a aucun effet du tout). Si vous n'utilisez pas le GC, vous fuyez tous les objets que vous allouez.

Sinon, si vous faites quelque chose comme

for (...) 
    [[[Foo alloc] init] autorelease] 

Vous ne coulera pas indéfiniment, mais aucun de vos objets instanciés seront recueillis jusqu'à ce que vous revenez en haut de la boucle d'événements (c.-à. Votre gestionnaire d'événements finit). Dans ce cas, vous pouvez utiliser beaucoup de mémoire à la fois, sans pour autant le perdre à long terme.

+0

J'appelle cette méthode à chaque fois qu'une minuterie se déclenche, c'est-à-dire quelques fois par seconde. Je ne suis pas dans un environnement GC. Merci. –

+0

mais que faites-vous du code? '[[Foo alloc] init]' ou '[[[Foo alloc] init] autorelease]'? – olliej

0

Avez-vous profilé votre code? Si oui, vous savez si c'est un point chaud. Si non, vous travaillez dans l'obscurité. Vous avez mentionné dans un commentaire "J'appelle cette méthode chaque fois qu'un temporisateur se déclenche, ce qui est quelques fois par seconde", auquel cas il est totalement irrelevent, le coût de l'allocation de la mémoire pour un objet plusieurs fois un la seconde sera complètement négligeable.

Questions connexes