第17页,共this WWDC14 presentation页,上面写着

与Objective-C合作?仍然需要管理自动释放池

这是什么意思?这是否意味着,如果我的代码库没有任何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变量应该在前}个变量之后释放(就像其他一些语言一样)?

推荐答案

Swift在返回autorelease个对象(由Objective-C代码或使用Cocoa类创建)时使用autoreleasepool模式.SWIFT函数中的autorelease种模式非常类似于Objtovi-C中的模式.例如,考虑您的方法的快速回溯(实例化NSImage/UIImage个对象):

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

如果在Instruments中运行此功能,您将看到一个包含5个小山丘的分配图(因为outer for loop),如下所示:

with autoreleasepool

但如果不使用自动释放池,则会发现峰值内存使用率更高:

without autoreleasepool

autoreleasepool允许您显式管理自动释放对象在Swift中解除分配的时间,就像在Objective-C中一样.

注意:在处理Swift本机对象时,通常不会收到autorelease对象.这就是为什么在演示中提到了"使用Objective-C"时只需要这一点的警告,尽管我希望苹果在这一点上更清楚.但是,如果您正在处理Objective-C对象(包括Cocoa类),它们可能是自动释放对象,在这种情况下,Objective-C @autoreleasepool模式的快速呈现仍然很有用.

Swift相关问答推荐

NSApplication是否需要NSApplicationDelegate?

Swift图表';chartXVisibleDomain挂起或崩溃

关闭 SwiftUI TabView 中的子视图

如何使用可搜索在搜索栏中搜索包括>或<?

可以将属性名称传递给 Swift 中的函数吗?

如何制作一个在 SceneKit 中投射阴影的透明物体?

避免 `(())` 显式指定 Void 类型的枚举关联值

类型擦除`AsyncMapSequence, Element>`

在这个使用 URLSession 的简单 case 中是否创建了一个强引用循环?

Swift Property Wrappers-Initialization 失败并显示无法将‘Double’类型的值转换为预期的参数类型

Swift // Sprite Kit:类别位掩码限制

如何在不将变量转换为字符串的情况下判断变量在 Swift 中是否为 Optional(nil)?

按钮图像不会立即刷新

SwiftUI - Select 器没有 Select 值

如何实现 Swift 的 Comparable 协议?

如何更改弹出框的大小

Swift :如何在一组字符之后得到所有东西

在 Swift 中覆盖 UIScrollView 的委托属性(就像 UICollectionView 一样)

Swift 2.0 按属性对对象数组进行排序

在 Swift 中从服务器播放视频文件