是否有必要在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是否足够聪明以知道number
variables应该在第一个之后被释放(就像其他一些语言一样)?
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
允许你明确地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:]
。