为了账号安全,请及时绑定邮箱和手机立即绑定

是否有必要在Swift程序中使用autoreleasepool?

/ 猿问

是否有必要在Swift程序中使用autoreleasepool?

富国沪深 2019-08-08 10:50:17

是否有必要在Swift程序中使用autoreleasepool?

它说,在WWDC14演示文稿的第17页

使用Objective-C?还是要管理自动释放池
autoreleasepool {/ * code * /}

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

有一个例子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);
            }
        }
    }}

如果上面的代码被autoreleasepool删除后转换成Swift ,那么Swift是否足够聪明,知道该number变量应该在第一个之后发布}(就像其他语言一样)?


查看完整描述

2 回答

?
开满天机

autoreleasepool返回autorelease对象(由Objective-C代码或使用Cocoa类创建)时,模式在Swift中使用。autoreleaseSwift中的模式与Objective-C中的模式非常相似。例如,考虑一下你的方法的Swift再现(实例化NSImageUIImage对象):

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

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

https://img1.sycdn.imooc.com/5d4b8e1c0001a1c604620066.jpg

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

https://img4.sycdn.imooc.com/5d4b8e1e0001170f04620066.jpg

autoreleasepool允许时自动释放对象斯威夫特被释放你明确地管理,就像你能在Objective-C。

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


查看完整回答
反对 回复 2019-08-08
?
梵蒂冈之花

如果您将在等效的Objective-C代码中使用它,那么您将在Swift中使用它。

将Swift足够聪明地知道数字变量应该在第一个之后发布}

只有Objective-C这样做。两者都遵循Cocoa内存管理规则。

当然ARC知道number在循环的迭代结束时超出范围,如果保留它,它将在那里释放它。但是,这并不能告诉您对象是否已自动释放,因为-[NSNumber numberWithInt:] 可能会或可能不会返回自动释放的实例。您无法知道,因为您无法访问其来源-[NSNumber numberWithInt:]


查看完整回答
反对 回复 2019-08-08

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信