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) 統一跳轉清理
bail: 區塊釋放所有資源,避免重複代碼、避免漏釋放。Swift 使用 defer 保證離開作用域時執行清理;C++ 用智慧指標/析構函數自動管理。Objective-C 仍常見此模式,尤其呼叫 C API 時。