Що еквівалентно @autoreleasepool у Swift?


76

У Swift я помічаю, що @autoreleasepool{}конструкції немає , хоча Swift і використовує ARC. Яким є правильний спосіб керувати автореліз-пулом у Swift, чи його було видалено з якихось причин?


можливо, він просто ще не випущений для нас (а реалізувати спеціальний з мостом ObjC легко)
Брайан Чен,

Також пов’язані та зацікавлені: "Чи потрібно використовувати програму автоматичного випуску в програмі Swift?" stackoverflow.com/questions/25860942 / ...
ВАЛЕНТИН Шергін

Відповіді:


118

Це докладно пояснюється у відеозаписі сесії WWDC 2014 за номером 418 "Покращення програми за допомогою інструментів", яке ви також можете завантажити у форматі PDF.

Але коротше, синтаксис такий:

autoreleasepool {
  /* code */ 
}

7
Важливо зауважити, що { сусло повинно бути на тому самому рядку, що і autoreleasepool, інакше його доведеться обернути ( ). Це насправді дратує, якщо чесно ...
Ерік,

1
@SiLo справді? Це відмовно. Вам слід подати звіт про помилку.
Абхі Беккерт

19
@AbhiBeckert @SiLo Це не помилка. autorelease- це функція, яка приймає замикання як аргумент. Це приклад синтаксису короткого замикання як останнього аргументу.
Cezary Wojcik

1
@CezaryWojcik Правильно, але чому це має значення, якщо я розміщу {на новому рядку, а не відразу після?
Ерік

6
@SiLo Оскільки крапки з комою немає, якщо закриття знаходиться в наступному рядку, тоді немає синтаксичної гарантії того, що це закриття повинно бути аргументом для функції над ним. Ви можете побачити те саме в JavaScript, коли намагаєтесь зробити щось подібне return { ... }.
Cezary Wojcik

16

Просто FYI, Xcode створив повний код таким чином:

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

Вгадайте, що в дужках ідентифікується закриття функцій.


3
не впевнений, чому хтось проголосував за цей коментар, оскільки він вказує на те, що пулу автовипуску настільки swift1.2 потрібно, щоб код був завернутий
bolnad


0

Я використав такий тип структури у своєму коді. Ця функція створює мініатюру із 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!)
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.