内存管理 – 是否有必要在Swift程序中使用autoreleasepool?

this WWDC14 presentation的第17页,它说

Working with Objective-C? Still have to manage autorelease pools
autoreleasepool { /* code */ }

这意味着什么?这是否意味着如果我的代码库没有任何Objective-C文件,autoreleasepool {}是不必要的?

an answer of a related question,有一个例子,autoreleasepool可以是有用的:

- (void)useALoadOfNumbers {
    for (int j = 0; j < 10000; ++j) {
        @autoreleasepool {
            for (int i = 0; i < 10000; ++i) {
                NSNumber *number = [NSNumber numberWithInt:(i+j)];
                NSLog(@"number = %p",number);
            }
        }
    }
}

如果上面的代码被转换为Swift与autoreleasepool删除,Swift会聪明到足以知道数字变量应该在第一个之后释放(像其他语言一样)?

当返回自动释放对象(由你的Objective-C代码或使用Cocoa类创建)时,在Swift中使用autoreleasepool模式。 Swift中的自动释放模式与Objective-C中的一样。例如,考虑你的方法的Swift再现(实例化NSImage / UIImage对象):
func useManyImages() {
    let filename = pathForResourceInBundle

    for _ in 0 ..< 5 {
        autoreleasepool {
            for _ in 0 ..< 1000 {
                let image = NSImage(contentsOfFile: filename)
            }
        }
    }
}

如果在Instruments中运行,您将看到如下所示的分配图:

但是如果你没有自动释放池,你会看到峰值内存使用率更高:

autoreleasepool允许你显式管理当自动释放对象在Swift中释放,就像你在Objective-C中。

注意:当处理Swift本机对象时,通常不会接收自动释放对象。这就是为什么演示文稿提到了当“使用Objective-C”时只需要这个提示,虽然我希望苹果在这一点上更清楚。但是如果你处理Objective-C对象(包括Cocoa类),它们可能是自动释放对象,在这种情况下,Objective-C @autoreleasepool模式的Swift再现仍然有用。

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...