Swift 中的 @autoreleasepool 等价物是啥?

Posted

技术标签:

【中文标题】Swift 中的 @autoreleasepool 等价物是啥?【英文标题】:What is the equivalent of @autoreleasepool in Swift?Swift 中的 @autoreleasepool 等价物是什么? 【发布时间】:2014-07-31 20:51:03 【问题描述】:

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

【问题讨论】:

也许它还没有发布给我们(并且使用 ObjC 桥实现一个自定义的桥很容易) 也相关且感兴趣:“是否有必要在 Swift 程序中使用 autoreleasepool?” ***.com/questions/25860942/… 【参考方案1】:

有!只是在任何地方都没有真正提及。

autoreleasepool 
    Do things....

【讨论】:

【参考方案2】:

语法如下:

autoreleasepool 
  /* code */ 

不幸的是,Apple 的 WWDC 2014 视频似乎不再可用。万一它回来了,它在 WWDC 2014 会议视频编号 418“使用仪器改进您的应用程序”中进行了介绍。

swift documentation 目前不包含任何有用的内容。但是您可以在 NSAutoreleasePool 和 Advanced Memory Management Programming Guide 的 Obj-C 运行时参考下找到大量有用的信息。

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

【讨论】:

注意必须autoreleasepool在同一行,否则你必须将它包裹在( )中。说实话,这真的惹恼了我...... @SiLo 真的吗?太糟糕了。您应该提交错误报告。 @AbhiBeckert @SiLo 这不是错误。 autorelease 是一个将闭包作为参数的函数。这是一个简写闭包作为最后一个参数语法的例子。 @CezaryWojcik 是的,但是如果我将 放在新行而不是紧随其后,这有什么关系呢? @SiLo 由于没有分号,如果闭包在下一行,则不能保证该闭包应该是它上面的函数的参数。当您尝试执行 return ... 之类的操作时,您可以在 javascript 中看到相同的内容。【参考方案3】:

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

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

猜括号标识函数闭包。

【讨论】:

不知道为什么有人反对这条评论,因为他指出 swift1.2 的自动释放池需要将代码包装在闭包中【参考方案4】:

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

【讨论】:

以上是关于Swift 中的 @autoreleasepool 等价物是啥?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 9 中的 autoreleasePool 有啥不同?

UIApplication 循环中的 AutoreleasePool

自动释放池的前世今生 ---- 深入解析 autoreleasepool

iOS之深入解析自动释放池autoreleasepool的底层原理

OC调用Swift

(20)Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)