Est-il nécessaire d’utiliser autoreleasepool dans un programme Swift?

À la page 17 de cette présentation WWDC14 , il est dit

Travailler avec Objective-C? Encore faut-il gérer les pools d’autorelease
autoreleasepool {/ * code * /}

Qu’est-ce que ça veut dire? Est-ce que cela signifie que si mon code ne contient aucun fichier Objective-C, autoreleasepool {} est inutile?

En réponse à une question connexe , il existe un exemple où autoreleasepool peut être utile:

 - (void)useALoadOfNumbers { for (int j = 0; j < 10000; ++j) { @autoreleasepool { for (int i = 0; i < 10000; ++i) { NSNumber *number = [NSNumber numberWithInt:(i+j)]; NSLog(@"number = %p", number); } } } } 

Si le code ci-dessus est traduit en Swift avec autoreleasepool supprimé, Swift sera-t-il suffisamment intelligent pour savoir que la variable de number doit être publiée après le premier } (comme le font certaines autres langues)?

Le modèle autoreleasepool est utilisé dans Swift lors du renvoi d’objects autorelease (créés par votre code Objective-C ou à l’aide de classes Cocoa). Le modèle d’ autorelease dans Swift fonctionne comme dans Objective-C. Par exemple, considérez ce rendu Swift de votre méthode (instanciation d’objects NSImage / UIImage ):

 func useManyImages() { let filename = pathForResourceInBundle for _ in 0 ..< 5 { autoreleasepool { for _ in 0 ..< 1000 { let image = NSImage(contentsOfFile: filename) } } } } 

Si vous exécutez ceci dans Instruments, vous verrez un graphique d'allocation comme celui-ci:

avec autoreleasepool

Mais si vous le faites sans le pool d’autorelease, vous verrez que la consommation maximale de mémoire est plus élevée:

sans autoreleasepool

autoreleasepool vous permet de gérer explicitement lorsque les objects autorelease sont désalloués dans Swift, comme vous avez pu le faire avec Objective-C.

Remarque: Lorsque vous traitez des objects natifs Swift, vous ne recevrez généralement pas d’objects autorelease. C'est pourquoi la présentation mentionnait la mise en garde concernant le fait de ne pas avoir besoin de cela pour "travailler avec Objective-C", même si je souhaiterais que Apple soit plus clair sur ce point. Mais si vous traitez avec des objects Objective-C (y compris des classes Cocoa), ils peuvent être des objects autorelease, auquel cas ce rendu Swift du motif Objective-C @autoreleasepool est toujours utile.

Si vous l’utilisiez dans le code Objective-C équivalent, vous l’utiliseriez alors dans Swift.

Swift sera-t-il assez intelligent pour savoir que la variable de numéro doit être libérée après le premier}

Seulement si Objective-C le fait. Les deux fonctionnent selon les règles de gestion de la mémoire Cocoa.

Bien sûr, ARC sait que ce number est hors de scope à la fin de cette itération de la boucle, et s’il le conservait, il le libérerait là. Toutefois, cela ne vous dit pas si l’object a été automatiquement relâché, car -[NSNumber numberWithInt:] peut ou non renvoyer une instance à libération automatique. Il n’ya aucun moyen de savoir, car vous n’avez pas access à la source de -[NSNumber numberWithInt:] .