整理自《Effective Objective-C 2.0》等經典教材的核心觀念,涵蓋實例變數慣例、全域/靜態變數、列舉、typedef 及資料類型轉換規則。
_ 開頭(如 _name),區別於屬性名稱@implementation 中顯式宣告實例變數為 @private,子類別無法直接存取,需透過繼承的存取方法@synthesize,只需在 @interface 宣告 @propertyg 開頭(如 int gMoveNumber = 1;)extern int gMoveNumber; 為宣告非定義,不配置記憶體extern;少數處使用時在各函數內部宣告// 檔案層級 static:僅限本檔案可見(內部連結)
static int gGlobalVar = 0;
// 函數內部 static:保持狀態,僅初始化一次
void counter() {
static int count = 0;
printf("%d\n", ++count);
}
static 修飾全域變數限制連結範圍;修飾區域變數延長生命週期至程式結束。
enum Direction {
Up, // 0
Down, // 1
Left = 10, // 指定值
Right // 11 (自動遞增)
};
NS_ENUM/NS_OPTIONS 宏使用(現代 Objective-C)typedef int Counter;
Counter i, j; // 等同 int i, j;
// 複雜類型簡化
typedef void (^CompletionBlock)(BOOL success, NSError *error);
CompletionBlock callback = ^(BOOL s, NSError *e) { ... };
提升程式碼自文件化程度,明確變數用途。
運算元類型不同時,編譯器依優先序自動轉換:
long double → 最高優先級doublefloatbool、char、short、enum、位域 → intlong long / longint → 最低優先級char c = 200; // 假設 char 為 signed (-128~127) int i = c; // 整數提升:c 先轉為 int (-56),再賦值給 i // 結果 i == -56,而非 200! unsigned char uc = 200; int j = uc; // 提升為 int (200),結果正確
教訓:涉及有號/無號、大小不同類型運算時,務必明確轉型或使用固定寬度類型。