Objective-C 淺析:核心知識體系全景圖
Objective-C 是 C 的超集,加入 Smalltalk 風格消息機制、動態運行時、引用計數內存管理。本文將 50+ 核心知識點按模塊組織,兼顧語法速查與深度原理,並附高頻面試題解析。
模塊一:基礎語法與類結構
1. 類定義:介面 + 實現
// MyClass.h
@interface MyClass : NSObject
{
@private
NSString *_ivar; // 實例變量,默認 @protected
}
- (void)instanceMethod;
+ (void)classMethod;
@property (copy) NSString *name;
@end
// MyClass.m
@implementation MyClass
@synthesize name = _name; // 手動合成或自動合成
- (void)instanceMethod { ... }
+ (void)classMethod { ... }
@end
2. 核心關鍵字
| 關鍵字 | 含義 |
id | 任意對象指針類型,已隱含 * |
nil | 空對象指針,發送消息無效且安全 |
SEL | 方法選擇器 (方法名唯一標識,編譯期生成) |
IMP | 方法實現函數指針 id (*IMP)(id, SEL, ...) |
Class | 類對象指針 |
BOOL/YES/NO | 布爾類型 (signed char) |
3. 消息機制 [receiver message]
- 編譯器轉為
objc_msgSend(receiver, @selector(message))
- 動態查找:
receiver->isa->cache → methodLists → superclass
nil 接收者安全無崩潰,返回 0/nil/結構體零值
模塊二:Runtime 核心
4. 類對象結構體
struct objc_class {
Class isa; // 指向 metaclass
Class super_class; // 父類
const char *name; // 類名
struct objc_ivar_list *ivars; // 實例變量列表
struct objc_method_list **methodLists; // 方法列表
struct objc_cache *cache; // 方法緩存 (SEL→IMP)
struct objc_protocol_list *protocols;
};
5. Metaclass 體系
- 實例
isa → 類對象 (存實例方法/變量)
- 類對象
isa → Metaclass (存類方法)
- 所有 Metaclass
isa → 根 Metaclass (NSObject)
- 根 Metaclass
isa → 自身
6. 消息轉發三階段
- 動態方法解析:
+resolveInstanceMethod: / +resolveClassMethod: 動態添加實現
- 備用接收者:
-forwardingTargetForSelector: 轉發給其他對象
- 完整轉發:
-methodSignatureForSelector: + -forwardInvocation: 構造 NSInvocation 任意處理
模塊三:內存管理 (MRC/ARC)
7. 引用計數規則 (MRC)
| 操作 | 計數變化 | 所有權 |
alloc/new/copy/mutableCopy | +1 | 你擁有 |
retain | +1 | 你擁有 |
release | -1 (歸零觸發 dealloc) | 放棄擁有 |
autorelease | 延遲 -1 (當前 AutoreleasePool 銷毀時) | 暫時擁有 |
8. @property 屬性修飾符
@property (nonatomic, strong) NSString *name; // ARC 默認 strong
@property (nonatomic, copy) NSString *label; // 防可變對象副作用
@property (nonatomic, assign) NSInteger count; // 基本類型/弱引用
@property (nonatomic, weak) id delegate; // 打破循環引用
@property (readonly) NSInteger hash; // 僅 getter
9. ARC 核心規則
- 強引用 (strong) = retain;弱引用 (weak) = 不增加計數,對象釋放自動置 nil。
__weak / __strong / __unsafe_unretained / __autoreleasing 修飾變量。
- Block 截獲對象默認 strong,需
__weak typeof(self) weakSelf = self; 打破循環。
模塊四:進階特性
10. Block 閉包
void (^block)(int) = ^(int x) { return x * 2; };
// 截獲局部變量默認按值複製;__block 修飾可修改外部變量
// Block 類型:_NSConcreteStackBlock / _NSConcreteMallocBlock / _NSConcreteGlobalBlock
11. 協議與代理
@protocol MyDelegate
@required - (void)requiredMethod;
@optional - (void)optionalMethod;
@end
@interface A : NSObject
@property (weak) id delegate;
@end
// B 實現協議,A.delegate = b; [a.delegate requiredMethod];
12. 分類 vs 擴展
| Category | Extension (Class Extension) |
| 可向現有類添加方法 (無需源碼) | 僅在 .m 文件中聲明私有屬性/方法 |
| 不能添加實例變量 (關聯對象除外) | 可添加實例變量 (編譯期佈局) |
| 方法可選實現 | 方法必須實現 (否則編譯警告) |
13. KVC / KVO
- KVC:
[obj valueForKey:@"name"] / [obj setValue:@"" forKey:@"name"] 通過字符串訪問屬性
- KVO:觀察者模式,
[obj addObserver:observer forKeyPath:@"name" options:0 context:NULL]
模塊五:高頻面試題精選
- 多重繼承? 無,用
Protocol + 代理組合實現多態。
- 私有方法/變量? 變量默認
@protected,可用 @private;方法無私有,用 Category/Extension 模擬。
- C/C++/OC 混編?
.m 編譯 OC/C;.mm 編譯 OC/C/C++;C++ 頭文件不可含 OC 語法,用 extern "C" 隔離。
- 目標-動作機制? 控件存
target/action,事件觸發時 [target performSelector:action]。
- #import vs #include?
#import 自動防重複包含;@class 前向聲明減少編譯依賴。
- 內存管理口訣? 「你創建/保留/複製 → 你釋放」;
autorelease 延遲釋放,適合工廠方法返回值。
- 淺/深拷貝? 淺拷貝複製指針 (引用計數+1);深拷貝分配新內存複製內容 (如
mutableCopy/archive/unarchive)。
- 動態運行時含義? 類型綁定、方法調用、消息轉發均推遲到運行時,支撐多態、動態添加方法、Swizzling。
- 棧 vs 堆? 棧:編譯器管理、LIFO、~8MB、高效;堆:手動管理、任意大小/生命周期、碎片、較慢。
模塊六:開發生態
| 組件 | 角色 | 類比 |
| Xcode | IDE | Visual Studio |
| Objective-C | 語言 | C++/Java/C# |
| Cocoa / Cocoa Touch | 框架庫 (Foundation, AppKit/UIKit, CoreData...) | .NET Framework / JDK / MFC |
小結
Objective-C = C 語法 + Smalltalk 消息 + 動態 Runtime + 引用計數內存。
掌握 isa/元類/消息轉發/ARC/Block/協議/Category 六大支柱,配合 Xcode/Instruments/LLDB 工具鏈,即可駕馭 iOS/macOS 系統級開發。