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