在Swift中,@autoreleasepool的等效语句是什么?

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

也许它只是还没有对我们发布(而且使用ObjC桥接实现一个自定义的也很容易) - Bryan Chen
1
还有相关的问题和兴趣:“在Swift程序中使用autoreleasepool是否必要?”https://dev59.com/DF8e5IYBdhLWcg3wVJIC?rq=1 - Valentin Shergin
4个回答

118

语法如下:

autoreleasepool {
  /* code */ 
}

很遗憾,苹果公司的WWDC 2014视频似乎不再可用。如果它回来了,那么它是在WWDC 2014会议视频编号418“使用Instruments改进您的应用程序”中介绍的。

Swift文档目前没有实用的内容。但是,在Obj-C运行时参考中可以找到大量有用的信息,如NSAutoreleasePool高级内存管理编程指南

注意:自动释放池今天已经不像过去那样重要。现代代码应使用自动引用计数,它根本不使用释放池。但是,截至2021年,仍有许多遗留代码(包括苹果的框架)使用自动释放池。例如,如果您正在对图像执行任何类型的批处理,则可能应使用autoreleasepool块。


7
需要注意的是,左大括号{必须和autoreleasepool保持在同一行,否则您需要用圆括号( )将其包裹起来。说实话,这真的让我很烦恼... - Erik
19
这不是一个错误。 "autorelease" 是一个以闭包为参数的函数。这是简写闭包作为最后一个参数语法的示例。 - Cezary Wojcik
7
由于没有分号,如果闭包在下一行,那么就没有语法保证该闭包应该是它上面函数的一个参数。当你尝试像这样做return { ... }时,在 JavaScript 中也会出现类似情况。 - Cezary Wojcik
1
@CezaryWojcik 啊,这很有道理。这里有一个代码的要点:https://gist.github.com/abhibeckert/2a9006d3f24a0937a932 — 基本上因为没有分号来终止行,编译器就没有任何方法将这两个语句链接在一起。这很遗憾,但可能是不可避免的。 - Abhi Beckert
1
我在网上找不到这个视频。看起来苹果已经将其删除了。我还尝试了从 Mac App Store 下载的苹果 Developer.app 应用程序。 - Ben Butterworth
显示剩余8条评论

16

只是提供信息,Xcode构建的完整代码如下:

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

猜测括号确定函数的闭包。


3
不确定为什么有人对这条评论进行了否定,因为他指出自动释放池(autorelease pool)需要将代码包装在闭包中,至少在Swift1.2中是这样。 - bolnad

7
有!只是没有被提及到。
autoreleasepool {
    Do things....
}

1

我在我的代码中使用了这种结构。这个函数是从视频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!)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接