首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Objective-C 類型系統深度解析:BOOL、bool、Class 與 SEL

     編輯:關於C語言

Objective-C 類型系統深度解析:BOOL、bool、Class 與 SEL

許多初學者容易混淆 bool、BOOL、Class 與 SEL 等類型。本文從底層實現與使用場景兩個維度,徹底釐清它們的區別與聯繫。

一、bool vs BOOL:兩種布爾類型的本質區別

特性bool (C99)BOOL (Objective-C)
定義來源<stdbool.h><objc/objc.h>
取值true / falseYES / 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混編,兩者可共存,但嚴禁混用判斷邏輯。

二、SEL 類型:方法選擇器

  • 對應OC中的方法名稱(選擇器)
  • 本質是指向方法的指針(編譯器生成的唯一標識)
  • 常用於動態調用:performSelector:、NSSelectorFromString()
  • @selector(methodName) 獲取編譯時期的 SEL

三、Class 類型:類對象

Class 是指向類對象的指針,用於表示一個類本身(而非實例)。常見操作:

// 獲取類對象
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]]) { ... } // 精確類型

四、實戰最佳實踐

  1. 新代碼優先用 bool:符合C99標準,類型安全,避免截斷問題
  2. 與蘋果框架交互用 BOOL:如 UIView 的 hidden 屬性
  3. 動態特性用 SEL/Class:運行時方法調用、插件架構、KVO/KVC
  4. 切勿直接比較 BOOL 與 YES/NO:用 if (flag) 而非 if (flag == YES)

五、總結

理解這些類型的底層表示與語義差異,能避免大量難以排查的邏輯錯誤。記住:bool 是現代C的標準布爾,BOOL 是OC歷史遺留的帶符號字節;SEL 是方法身份證,Class 是類的身份證。

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