qu'est-ce que autorelease pool

a quoi cela sert exactement et dans quel cas il est important de s'en servir?

Réponses

  • 21:11 modifié #2

    The NSAutoreleasePool class is used to support Cocoa's reference-counted memory management system. An autorelease pool stores objects that are sent a release message when the pool itself is drained.

    In a reference-counted environment (as opposed to one which uses garbage collection), an NSAutoreleasePool object contains objects that have received an autorelease message and when drained it sends a release message to each of those objects. Thus, sending autorelease instead of release to an object extends the lifetime of that object at least until the pool itself is drained (it may be longer if the object is subsequently retained). An object can be put into the same pool several times, in which case it receives a release message for each time it was put into the pool.


    Ce n'est pas sorcier à  comprendre.
    En résumé, si tu détaches un nouveau thread, tu dois gérer l'autorelease pool.
    Elle sert à  emmagasiner les objets ayant reçu un message -autorelease, et ainsi étendre leur durée de vie jusqu'à  ce que la pool soit drainée.
    Attention cependant. les messages -drain et -release de NSAutoreleasePool n'ont pas le même effet en environnement garbage-collected. -release n'aura aucun effet, il faudra utiliser -drain.
    Ainsi, beaucoup de personnes utilisent directement -drain plutôt que -release, vu que les deux ont le même effet de toute manière dans un environnement reference-counted.

    Exemple d'utilisation de l'autorelease-pool:
    <br />- (void)doSomethingWith:(id)anObject<br />{<br />	[NSThread detachNewThreadSelector:@selector(doThreadedThing:) withObject:anObject];<br />}<br /> <br />- (void)doThreadedThing:(id)anObject<br />{<br />	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];<br /><br />	NSArray* anArray = [NSArray array]; // = [[[NSArray alloc] init] autorelease];<br /><br />	[pool drain]; // or [pool release]; -- has the same effect in reference-counted environment<br />}<br />
    
  • muqaddarmuqaddar Administrateur
    21:11 modifié #3
    => Section commune.  >:)
  • Eddy58Eddy58 Membre
    21:11 modifié #4
    Très utile aussi dans des boucles avec un nombre très élevé d'itérations et d'objets manipulés à  l'intérieur, pour purger la mémoire entre 2 itérations.

    <br /><br /><br />for (id object in aBigArray)<br />{<br />&nbsp; &nbsp;  NSAutorelease *subPool=[[NSAutoreleasePool alloc] init];<br /><br />&nbsp; &nbsp;  //......Code avec un nombre conséquent de traitements .......<br /><br />&nbsp; &nbsp;  [subPool release];<br />}<br /><br />
    

  • 21:11 modifié #5
    dans 1308151398:

    Très utile aussi dans des boucles avec un nombre très élevé d'itérations et d'objets manipulés à  l'intérieur, pour purger la mémoire entre 2 itérations.

    <br /><br /><br />for (id object in aBigArray)<br />{<br />&nbsp; &nbsp;  NSAutorelease *subPool=[[NSAutoreleasePool alloc] init];<br /><br />&nbsp; &nbsp;  //......Code avec un nombre conséquent de traitements .......<br /><br />&nbsp; &nbsp;  [subPool release];<br />}<br /><br />
    



    Aussi! Bien trouvé je n'y ai pas pensé sur le coup.
    Par contre la façon dont tu l'as fait je doute de que ça soit efficace niveau CPU? J'aurai mis un incrémental, du genre tous les 100 items

    @Muqaddar désolé je pense jamais à  vérifier la bonne place des topics quand je réponds
  • Eddy58Eddy58 Membre
    21:11 modifié #6
    dans 1308155356:


    Aussi! Bien trouvé je n'y ai pas pensé sur le coup.
    Par contre la façon dont tu l'as fait je doute de que ça soit efficace niveau CPU? J'aurai mis un incrémental, du genre tous les 100 items



    Pourquoi pas en effet, mais tout dépend de ce que tu as à  faire dans ta boucle et des volumes de données traités. Si beaucoup de mémoire est utilisée, mieux vaut la purger dès que possible plutôt que d'aller augmenter les besoins en mémoire virtuelle et du même coup le swapping, ce qui n'améliorera pas non plus le CPU.
  • 21:11 modifié #7
    On est d'accord  ;)
Connectez-vous ou Inscrivez-vous pour répondre.