#import <Cocoa/Cocoa.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Setup code that might create autoreleased objects goes here.
}
return NSApplicationMain(argc, argv);
}
為什么這很重要,以至于樣板檔案將其包含在新的 Objective-C 專案中而不是新的 Swift 專案中?
uj5u.com熱心網友回復:
Xcode 的專案模板沒有以任何有意義的方式記錄,因此不可能給出明確的答案——但是,有一些可能的促成因素,主要是歷史因素。
在引入 ARC 幫助自動化參考計數之前,Objective-C 需要完全手動的記憶體管理。以“自動化”方式更松散地管理分配的一種策略是通過
-autorelease將物件添加到全域(可能是嵌套的)物件池中來最終處置物件,當池本身被處置時,可以處置該物件池。這本身就是通過使用-[[NSAutoreleasePool alloc] init]和-[NSAutoreleasePool drain]/創建自動釋放池的手動操作-[NSAutoreleasePool release]。當呼叫-autorelease一個物件時,Obj-C 運行時會找到“最近的”活動自動釋放池,并在該池中注冊該物件,一旦池消失,該物件將被釋放。為了能夠獲取
-autorelease一個物件,必須有一個autorelease實際活動的池來捕獲該物件——它似乎不再是這種方式,而是-autorelease在用于記錄錯誤的任何池之外生成一個物件(因為沒有什么可以除了永遠泄漏物件之外,真的可以安全地完成)。為了避免這種情況,默認的 Xcode 模板在 中的整個代碼周圍添加了一個隱式自動釋放池main,以確保至少有一些池處于活動狀態,以便無錯誤地捕獲物件。(實際上,在引入@autoreleasepool { ... }blocks之前,隱式的在包含的代碼執行之前創建了一個autoreleasepool,之后釋放它,Xcode模板用來手動創建一個autoreleasepool并在回傳之前釋放它main)ARC 的出現大大降低了自動釋放的必要性,以至于 Swift 甚至沒有自動釋放池的原生概念。(
autoreleasepool在 Swift 中實際上是來自模塊的函式ObjectiveC,它呼叫 Obj-C 運行時以將呼叫的閉包包裝在自動釋放池中。)雖然偶爾有用,但它們通常不是必需的,除非與仍然使用的 Objective-C 代碼互動時手動記憶體管理并出售自動釋放的物件,尤其是在緊密回圈中。在與 Foundation 等(主要是基于 Apple)的框架互動時偶爾會出現這種情況,這些框架可能仍然在考慮手動記憶體管理的情況下撰寫組件以這種方式創建的全域自動釋放池還有一個問題:因為以這種方式創建的最外層自動釋放池只會在程式退出之前釋放物件,釋放到默認最外層池的物件在執行期間幾乎有效地泄漏,因為有沒有什么可以更早地清理它們
因此,在 Swift 中缺乏需求、缺乏實用性以及在 Darwin 平臺之外不存在作為概念的自動發布之間,Xcode 確實沒有太多需要直接在 Swift 專案模板中公開這個概念曾經是 Objective-C 所必需的。可能為簡潔起見,不支付創建池的成本,也不會混淆非 Obj-C 代碼作者,這被排除在模板之外。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/462944.html
上一篇:在目標C中列印CMTime
