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

该WWDC14演示文稿的第17页上说

使用Objective-C? 还必须pipe理自动释放池
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是否足够聪明以知道numbervariables应该在第一个之后被释放(就像其他一些语言一样)?

autoreleasepool模式在Swift中用于返回autorelease对象(由您的Objective-C代码或使用Cocoa类创build)。 Swift中的autorelease模式的function与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

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

没有autoreleasepool

autoreleasepool允许你明确地pipe理autorelease对象在Swift中的释放,就像你在Objective-C中一样。

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

如果你在相同的Objective-C代码中使用它,那么你可以在Swift中使用它。

将Swift足够聪明,知道数字variables应该被释放后的第一个}

只有Objective-C可以。 两者都沿着Cocoa内存pipe理规则进行操作。

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