memory-management - 在 Swift 程序中有必要使用 autoreleasepool 吗?

标签 memory-management swift

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 是否足够聪明,知道应该在第一个 之后释放 number 变量} (像其他一些语言一样)?

最佳答案

autoreleasepool 模式在 Swift 中用于返回 autorelease 对象(由您的 Objective-C 代码或使用 Cocoa 类创建)。 Swift 中的 autorelease 模式与 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 中运行它,您将看到一个带有 5 小山丘的分配图(因为外部 for 循环),如下所示:

with autoreleasepool

但是如果你在没有自动释放池的情况下这样做,你会发现峰值内存使用率更高:

without autoreleasepool

autoreleasepool 允许您在 Swift 中明确管理何时释放自动释放对象,就像您在 Objective-C 中所做的那样。

注意:在处理 Swift 原生对象时,一般不会收到 autorelease 对象。这就是为什么演示文稿提到只有在“使用 Objective-C”时才需要这个的警告,尽管我希望 Apple 在这一点上更清楚。但是,如果您正在处理 Objective-C 对象(包括 Cocoa 类),它们可能是自动释放对象,在这种情况下,Objective-C @autoreleasepool 模式的 Swift 版本仍然有用。

关于memory-management - 在 Swift 程序中有必要使用 autoreleasepool 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53429323/

相关文章:

Swift、Parse 和 Xcode 6 beta6

ios - 通用链接在真实设备上不起作用

ios - Swift 3 使用 Reachability 检查互联网连接

linux - Linux内核建立映射虚拟物理地址的src代码点在哪里?

c++ - 为什么动态内存分配(堆)出现运行时错误?

ios - 如果我现在开始学习iOS开发,我应该使用垃圾回收功能吗?

c++ - 调用析构函数或调用 `delete` 时是否释放内存?

ios - 表情符号在使用 swift(iOS)、java(android)、ruby(server)、mongodb(database) 制作的应用程序中显示为问号

ios - SwiftUI View 内容布局意外弹出/跳转出现?

memory-management - vmalloc() 是否仅在 32 位 x86 上从 ZONE_HIGHMEM 获取内存?