在 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 循环),如下所示:
但是如果你在没有自动释放池的情况下这样做,你会发现峰值内存使用率更高:
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/