是否有必要在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中使用。autoreleaseSwift中的模式與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 關注
- 2372 瀏覽
添加回答
舉報
0/150
提交
取消
