首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS 程式碼中「bail:」標籤用途:goto 錯誤處理模式

     編輯:程式設計綜合問答

代碼片段來源

Apple 範例專案 SquareCam 中的 SquareCamViewController.m:

bail:
    if (err && image) { CGImageRelease(image); image = NULL; }
    if (provider) CGDataProviderRelease(provider);
    if (colorspace) CGColorSpaceRelease(colorspace);
    *imageOut = image;
    return err;

這是什麼語法?

bail: 是 C 語言的 **標籤**,配合 goto bail; 使用,用於**統一錯誤處理與資源釋放**流程。

實際運作機制

專案中定義宏(在 AssertMacros.h):

#define require(condition, label) \
    do { if (!(condition)) goto label; } while(0)

函式開頭:

OSStatus err = noErr;
CGImageRef image = NULL;
CGDataProviderRef provider = NULL;
CGColorSpaceRef colorspace = NULL;

require(err == noErr, bail);  // 若 err 非 noErr,跳轉到 bail 標籤
// ... 後續代碼若任何步驟失敗,呼叫 require(err, bail) 統一跳轉清理

為何這樣寫?

  • C 語言無 try/catch/finally,多重資源分配需在每個失敗點正確釋放已分配資源。
  • 集中在函式尾部 bail: 區塊釋放所有資源,避免重複代碼、避免漏釋放。
  • 這是系統級、嵌入式、Core Foundation 代碼的**標準慣用模式**。

現代替代:Swift defer / C++ RAII

Swift 使用 defer 保證離開作用域時執行清理;C++ 用智慧指標/析構函數自動管理。Objective-C 仍常見此模式,尤其呼叫 C API 時。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved