| 特性 | 類方法 (靜態方法) | 實例方法 |
|---|---|---|
| 聲明 | + (returnType)methodName; | - (returnType)methodName; |
| 調用者 | 類對象 ([Class method]) | 實例對象 ([instance method]) |
| 訪問實例變量 | 不可直接訪問 | 可直接訪問 |
| 訪問類變量 | 可直接訪問 | 可直接訪問 |
| 多態性 | 支持 (子類繼承可覆蓋) | 支持 |
// 類方法調用 [MyClass classMethod]; // 1. 類名調用 (推薦) [[MyClass alloc] classMethod]; // 2. 實例調用 (合法但語義怪異) id cls = [MyClass class]; [cls classMethod]; // 3. 類對象變量調用 // 實例方法調用 MyClass *obj = [[MyClass alloc] init]; [obj instanceMethod]; // 唯一合法方式
__TEXT 段,只讀,加載一次,不佔用堆/棧alloc 在堆上分配,包含 isa 指針指向類對象self 反而破壞封裝。-save, -calculateArea)+array)、工具方法 (+stringWithFormat:)、單例訪問器 (+sharedInstance)、無狀態運算// 錯誤觀點:「類方法不需要 release,因為沒有對象」 // 正確理解: // 1. 類方法返回的對象 (如 [NSString string]) 通常為 autorelease,無需手動 release // 2. 類對象本身由 Runtime 管理,程序員不可也無需 release // 3. 若類方法返回 retained 對象 (罕見,如 +new 等效 [[alloc] init]),調用者需 release
理解「類也是對象」是關鍵。類方法本質是類對象的實例方法。選擇依據在於「是否需要實例狀態」,而非效率或簡便性。