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/>
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/> NSAutorelease *subPool=[[NSAutoreleasePool alloc] init];<br/><br/> //......Code avec un nombre conséquent de traitements .......<br/><br/> [subPool release];<br/>}<br/><br/>
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/> NSAutorelease *subPool=[[NSAutoreleasePool alloc] init];<br/><br/> //......Code avec un nombre conséquent de traitements .......<br/><br/> [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
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.
Réponses
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:
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
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.