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?
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?
Antworten:
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 */
}
{
müssen auf der gleichen Linie wie die sein autoreleasepool
, sonst muss man es in wickeln ( )
. Das ärgert mich wirklich , um ehrlich zu sein ...
autorelease
ist eine Funktion, die einen Abschluss als Argument verwendet. Dies ist ein Beispiel für die Syntax des Kurzschlusses als letztes Argument.
{
in eine neue Zeile setze, anstatt direkt danach?
return { ... }
.
Nur zu Ihrer Information, Xcode hat den vollständigen Code wie folgt erstellt:
autoreleasepool({ () -> () in
// code
})
Vermutlich geben die Klammern den Funktionsabschluss an.
Es gibt! Es wird einfach nirgendwo wirklich erwähnt.
autoreleasepool {
Do things....
}
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!)
}
}