Oui et non. Vous finiriez par libérer la mémoire de chaîne mais «fuir» l'objet NSAutoreleasePool dans la mémoire en utilisant drain au lieu de release si vous l'exécutiez dans un environnement garbage collection (non géré par la mémoire). Cette "fuite" rend simplement l'instance de NSAutoreleasePool "inaccessible" comme tout autre objet sans pointeurs puissants sous GC, et l'objet sera nettoyé lors de la prochaine exécution de GC, ce qui pourrait très bien être directement après l'appel à -drain
:
drainer
Dans un environnement garbage collection, déclenche garbage collection si la mémoire allouée depuis la dernière collecte est supérieure au seuil actuel; autrement se comporte comme une libération. ... Dans un environnement garbage collection, cette méthode appelle finalement objc_collect_if_needed
.
Sinon, c'est similaire à la façon dont -release
se comporte sous non-GC, oui. Comme d'autres l'ont indiqué, il -release
n'y a pas d'opération sous GC, donc le seul moyen de s'assurer que le pool fonctionne correctement sous GC est à travers -drain
, et -drain
sous non-GC fonctionne exactement comme -release
sous non-GC, et communique sans doute ses fonctionnalités plus clairement comme bien.
Je dois souligner que votre déclaration "tout ce qui est appelé avec new, alloc ou init" ne doit pas inclure "init" (mais doit inclure "copy"), car "init" n'alloue pas de mémoire, il configure uniquement l'objet (constructeur mode). Si vous avez reçu un objet alloué et que votre fonction n'a appelé init que comme tel, vous ne le libérez pas:
- (void)func:(NSObject*)allocd_but_not_init
{
[allocd_but_not_init init];
}
Cela ne consomme pas plus de mémoire que celle avec laquelle vous avez déjà commencé (en supposant que init n'instancie pas les objets, mais vous n'êtes pas responsable de ceux-ci de toute façon).