在Swift中相当于@autoreleasepool是什么?


76

在Swift中,我注意到没有@autoreleasepool{}构造,尽管Swift确实使用ARC。在Swift中管理自动释放池的正确方法是什么,或者由于某种原因将其删除了?


也许它还没有发布给我们(并使用ObjC桥实现自定义很容易)
Bryan Chen

也相关且感兴趣:“是否有必要在Swift程序中使用autoreleasepool?” stackoverflow.com/questions/25860942/...
瓦伦丁Shergin

Answers:


118

这在WWDC 2014会议视频418“使用仪器改进您的应用”中详细说明,您也可以将其下载为PDF。

简而言之,语法为:

autoreleasepool {
  /* code */ 
}

7
重要的是要注意,{ 必须与处于同一行autoreleasepool,否则必须将其包装在中( )。老实说,这让我感到讨厌……
2014年

1
@SiLo真的吗?糟透了。您应该提交错误报告。
Abhi Beckert 2014年

19
@AbhiBeckert @SiLo这不是错误。autorelease是一个将闭包作为参数的函数。这是简化的closure-as-last-argument语法的示例。
Cezary Wojcik 2014年

1
@CezaryWojcik是的,但是如果我将{换行符放在新行上而不是紧接在后,那又为什么呢?
Erik 2014年

6
@SiLo因为没有分号,所以如果闭包在下一行,则没有语法保证该闭包应该是其上方函数的参数。当您尝试执行时,您会在JavaScript中看到相同的内容return { ... }
Cezary Wojcik 2014年

16

仅供参考,Xcode构造完整的代码如下:

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

猜括号可以标识函数闭包。


3
不知道为什么有人反对这个评论,因为他指出一个自动释放池,在swift1.2之前需要将代码包装在闭包中
bolnad 2015年


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!)
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.