Was entspricht @autoreleasepool in Swift?

76

In Swift stelle ich fest, dass es kein @autoreleasepool{}Konstrukt gibt, obwohl Swift ARC verwendet. Was ist der richtige Weg, um einen Autoreleasepool in Swift zu verwalten, oder wurde er aus irgendeinem Grund entfernt?

Skotch
quelle
Vielleicht ist es nur noch nicht für uns freigegeben (und eine benutzerdefinierte mit ObjC Bridge implementiert ist einfach)
Bryan Chen
Ebenfalls verwandt und interessiert: "Ist es notwendig, Autoreleasepool in einem Swift-Programm zu verwenden?" stackoverflow.com/questions/25860942/…
Valentin Shergin

Antworten:

118

Dies wird ausführlich im WWDC 2014-Sitzungsvideo Nr. 418 "Verbessern Ihrer App mit Instrumenten" erläutert , das Sie auch als PDF herunterladen können.

Kurz gesagt lautet die Syntax:

autoreleasepool {
  /* code */ 
}
Abhi Beckert
quelle
7
Es ist wichtig zu beachten , dass die { müssen auf der gleichen Linie wie die sein autoreleasepool, sonst muss man es in wickeln ( ). Das ärgert mich wirklich , um ehrlich zu sein ...
Erik
1
@ SiLo wirklich? Das ist Scheiße. Sie sollten einen Fehlerbericht einreichen.
Abhi Beckert
19
@AbhiBeckert @SiLo Es ist kein Fehler. autoreleaseist eine Funktion, die einen Abschluss als Argument verwendet. Dies ist ein Beispiel für die Syntax des Kurzschlusses als letztes Argument.
Cezary Wojcik
1
@CezaryWojcik Richtig, aber warum ist es wichtig, wenn ich das {in eine neue Zeile setze, anstatt direkt danach?
Erik
6
@SiLo Da es keine Semikolons gibt, gibt es keine syntaktische Garantie dafür, dass dieser Abschluss ein Argument für die darüber liegende Funktion sein soll, wenn sich der Abschluss in der nächsten Zeile befindet. Sie können dasselbe in JavaScript sehen, wenn Sie versuchen, so etwas zu tun return { ... }.
Cezary Wojcik
16

Nur zu Ihrer Information, Xcode hat den vollständigen Code wie folgt erstellt:

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

Vermutlich geben die Klammern den Funktionsabschluss an.

Saukwood
quelle
3
Ich bin mir nicht sicher, warum jemand diesen Kommentar abgewählt hat, da er darauf hinweist, dass für einen Autorelease-Pool bis swift1.2 der Code in einen Abschluss eingeschlossen werden muss
bolnad
7

Es gibt! Es wird einfach nirgendwo wirklich erwähnt.

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

Ich habe diese Art von Struktur in meinem Code verwendet. Diese Funktion erstellt ein Miniaturbild aus der Video-URL.

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
quelle