¿Cuál es el equivalente de @autoreleasepool en Swift?

76

En Swift, noto que no hay @autoreleasepool{}construcción, aunque Swift usa ARC. ¿Cuál es la forma correcta de administrar un grupo de liberación automática en Swift o se ha eliminado por algún motivo?

Skotch
fuente
tal vez aún no se nos haya entregado (e implementar uno personalizado con el puente ObjC es fácil)
Bryan Chen
También relacionado e interesado: "¿Es necesario utilizar autoreleasepool en un programa Swift?" stackoverflow.com/questions/25860942/…
Valentin Shergin

Respuestas:

118

Esto se explica en detalle en el video número 418 de la sesión de la WWDC 2014 "Mejorando su aplicación con instrumentos", que también puede descargar como PDF.

Pero en resumen, la sintaxis es:

autoreleasepool {
  /* code */ 
}
Abhi Beckert
fuente
7
Es importante tener en cuenta que { debe estar en la misma línea que autoreleasepool, de lo contrario, debe envolverlo ( ). Eso realmente me molesta para ser honesto ...
Erik
1
@SiLo ¿de verdad? Eso apesta. Debería presentar un informe de error.
Abhi Beckert
19
@AbhiBeckert @SiLo No es un error. autoreleasees una función que toma un cierre como argumento. Este es un ejemplo de la sintaxis abreviada de cierre como último argumento.
Cezary Wojcik
1
@CezaryWojcik Correcto, pero ¿por qué importa si coloco el {en una nueva línea en lugar de justo después?
Erik
6
@SiLo Dado que no hay punto y coma, si el cierre está en la siguiente línea, entonces no hay una garantía sintáctica de que se suponga que ese cierre sea un argumento para la función que está encima. Puede ver lo mismo en JavaScript cuando intenta hacer algo como return { ... }.
Cezary Wojcik
16

Solo para su información, Xcode construyó el código completo de la siguiente manera:

autoreleasepool({ () -> () in
    // code              
})

Supongo que el paréntesis identifica el cierre de funciones.

Saukwood
fuente
3
No estoy seguro de por qué alguien desestimó este comentario, ya que está señalando que un grupo de liberación automática hasta swift1.2 necesita que el código esté envuelto en un cierre
bolnad
7

¡Ahi esta! En realidad, no se menciona en ninguna parte.

autoreleasepool {
    Do things....
}
Joshua Weinberg
fuente
0

Usé este tipo de estructura en mi código. Esta función es crear una imagen en miniatura a partir de la URL del video.

func getThumbnailImage(forUrl url: URL) -> UIImage? {
    return autoreleasepool{ () -> UIImage in
        let asset: AVAsset = AVAsset(url: url)
        let imageGenerator = AVAssetImageGenerator(asset: asset)
        var thumbnailImage: CGImage?
        do {
            thumbnailImage = try imageGenerator.copyCGImage(at: CMTimeMake(value: 1, timescale: 60) , actualTime: nil)
            return UIImage(cgImage: thumbnailImage!)
        } catch let error {
            print(error)
        }
        return UIImage(cgImage: thumbnailImage!)
    }
}
Yogesh Patel
fuente