剛接觸 Objective-C(簡稱 OC)的開發者,往往會被其冗長且極具特色的命名風格嚇一跳:application:didFinishLaunchingWithOptions: 這樣的方法名比比皆是。其實,OC 的命名規範並非故意增加難度,而是為了實現「見名知義」的自文檔化代碼。良好的命名能大幅降低維護成本,讓團隊協作更順暢。本文將系統梳理 OC 命名的核心規範、常見禁忌,以及新手易踩的坑。
Apple 官方文檔強調:代碼應該像英文句子一樣易讀。這意味著:
calculateTotalPrice、fetchUserData。initWithFrame:、stringByAppendingString:。MyViewController);方法、變量、屬性用小駝峰(userName、calculateTotal)。XYZUser、XYZButton+Extensions),防止與系統框架或第三方庫衝突。NSString、UIViewController、XYZOrderManager(大駝峰 + 前綴)...Delegate、...DataSource 結尾,或用形容詞如 NSCopying、XYZLoggable。- (instancetype)initWithFrame:(CGRect)frame;+ (instancetype)sharedInstance;is、has、can 開頭,如 isHidden、hasPermission、canEdit。firstName、count(不要加 get 前綴)。setFirstName:(由 @property 自動合成,手寫極少)。buttonTapped:、handleLoginSuccess:。_userName、_tableView。userName、tableView。k 開頭 + 大駝峰,kMaxRetryCount、kDefaultAnimationDuration;或用 static const / FOUNDATION_EXPORT 定義全局常量。文件名:ClassName+CategoryName.h/m(如 UIView+XYZCornerRadius.h)。
方法前綴:建議在分類方法名加前綴,如 xyz_addCornerRadius:,防止同名方法衝突。
| 場景 | 規則 | 說明 |
|---|---|---|
| 類名 vs 類名 | 全局唯一 | 必須加前綴,否則編譯報錯或鏈接衝突 |
| 類方法 vs 實例方法 | 同名允許 | 調用方式不同([Class method] vs [instance method]),但不建議同名,易混淆 |
| 實例變量 vs 屬性 | 自動合成時衝突 | @property 預設合成 _propertyName,手動定義 ivar 時避免同名 |
| 參數名 vs 實例變量/屬性 | 作用域遮蔽 | 方法內參數同名會遮蔽 ivar/屬性,需用 self.prop 或 _ivar 區分 |
| 宏定義 vs 變量/函數 | 全局文本替換 | 宏無作用域,極易污染,命名必須極具特徵(如 XYZ_LOG_ENABLED) |
| C 函數 vs OC 方法 | 不同命名空間 | 技術上允許同名,但強烈不建議,破壞一致性 |
// ❌ 反模式:縮寫不明、動詞缺失、前綴缺失
- (void)calc:(id)obj; // calc 是什麼?參數 obj 是什麼?
- (BOOL)chkUsr; // 縮寫嚴重,無參數語義
@interface User {} // 無前綴,極易衝突
// ✅ 佳作:語義完整、角色明確、帶前綴
- (BOOL)calculateTotalPriceWithItems:(NSArray *)items;
- (BOOL)checkUserPermission:(XYZPermissionType)permission;
@interface XYZUser {}
Product → Analyze 可捕獲命名不規範、未使用變量等問題。OC 命名規範看似繁瑣,實則是為了「可讀性」與「可維護性」這兩大軟件工程核心指標服務。新手只需記住:前綴隔離、動詞領頭、名詞補語、駝峰分類、常量大寫,再配合工具固化習慣,即可寫出專業級代碼。下次看到 application:didFinishLaunchingWithOptions: 時,請會心一笑——這正是 OC 之美的體現。