許多初學者容易混淆 bool、BOOL、Class 與 SEL 等類型。本文從底層實現與使用場景兩個維度,徹底釐清它們的區別與聯繫。
| 特性 | bool (C99) | BOOL (Objective-C) |
|---|---|---|
| 定義來源 | <stdbool.h> | <objc/objc.h> |
| 取值 | true / false | YES / NO |
| 底層類型 | _Bool(1字節) | signed char(1字節,帶符號) |
| 存儲特性 | 標準布爾類型 | 僅取最低8位,高位截斷 |
關鍵陷阱:將32位整數賦值給 BOOL 時,只保留低8位。若低8位為0則視為 NO,否則為 YES。例如:
BOOL flag = 256; // 0x100 -> 低8位為0 -> 實際為 NO
BOOL flag2 = 1; // 低8位為1 -> 實際為 YES
由於OC可與C混編,兩者可共存,但嚴禁混用判斷邏輯。
performSelector:、NSSelectorFromString()@selector(methodName) 獲取編譯時期的 SELClass 是指向類對象的指針,用於表示一個類本身(而非實例)。常見操作:
// 獲取類對象
Class cls1 = [NSString class]; // 類方法
Class cls2 = [someInstance class]; // 實例方法
Class cls3 = [someInstance superclass]; // 父類
Class cls4 = NSClassFromString(@"NSString"); // 字符串獲取
// 判斷類型
if ([obj isKindOfClass:[NSString class]]) { ... }
if ([obj isMemberOfClass:[NSString class]]) { ... } // 精確類型
bool:符合C99標準,類型安全,避免截斷問題BOOL:如 UIView 的 hidden 屬性if (flag) 而非 if (flag == YES)理解這些類型的底層表示與語義差異,能避免大量難以排查的邏輯錯誤。記住:bool 是現代C的標準布爾,BOOL 是OC歷史遺留的帶符號字節;SEL 是方法身份證,Class 是類的身份證。