是否有必要在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 回答
开满天机
TA贡献1786条经验 获得超13个赞
autoreleasepool
返回autorelease
对象(由Objective-C代码或使用Cocoa类创建)时,模式在Swift中使用。autorelease
Swift中的模式与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
允许时自动释放对象斯威夫特被释放你明确地管理,就像你能在Objective-C。
注意:处理Swift本机对象时,通常不会收到自动释放对象。这就是为什么演示文稿提到了在“使用Objective-C”时只需要这个的警告,尽管我希望Apple在这一点上更清楚。但是如果你正在处理Objective-C对象(包括Cocoa类),它们可能是自动释放对象,在这种情况下,Swift对Objective-C @autoreleasepool
模式的再现仍然很有用。
- 2 回答
- 0 关注
- 2275 浏览
添加回答
举报
0/150
提交
取消