Objective-C 繼承自 C,通過 `@interface` 與 `@implementation` 分離聲明與實現,採用消息傳遞機制。本文梳理最基礎的類定義模式。
// MyClass.h
#import <Foundation/Foundation.h>
@interface MyClass : NSObject
// 屬性聲明(現代語法自動合成實例變量)
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
// 實例方法聲明
- (void)round; // 無參無返回
- (NSString *)description; // 有返回值
- (void)setName:(NSString *)newName age:(NSInteger)newAge; // 多參數
// 類方法聲明
+ (instancetype)sharedInstance; // 單例工廠方法
@end
// MyClass.m
#import "MyClass.h"
@implementation MyClass
// 自動合成 _name, _age 實例變量
// @synthesize name = _name; // 現代LLVM可省略
- (instancetype)init {
self = [super init];
if (self) {
_name = @"Default";
_age = 0;
}
return self;
}
- (void)round {
NSLog(@"Round method called for %@", _name);
}
- (NSString *)description {
return [NSString stringWithFormat:@"<%@: %p> name=%@, age=%ld",
[self class], self, _name, (long)_age];
}
- (void)setName:(NSString *)newName age:(NSInteger)newAge {
_name = [newName copy];
_age = newAge;
}
+ (instancetype)sharedInstance {
static MyClass *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
@end
| 概念 | 語法 | 說明 |
|---|---|---|
| 實例方法 | - (ReturnType)methodName:(ParamType)paramName | 以 `-` 開頭,屬於對象實例 |
| 類方法 | + (ReturnType)methodName:(ParamType)paramName | 以 `+` 開頭,屬於類對象,常用工廠方法 |
| 屬性屬性 | nonatomic, strong/weak/copy, assign | 線程安全性、內存管理語義 |
| 實例變量 | @property 自動生成 `_propertyName` | 現代運行時自動合成,無需手寫 `@synthesize` |
| 初始化 | - (instancetype)init | 指定初始化器,返回 `instancetype` 支援子類 |
掌握這套聲明/實現分離模式,是閱讀 Cocoa/Cocoa Touch 框架源碼、編寫高質量 Objective-C 代碼的基石。Swift 雖已成主流,但大量存量代碼庫仍需 Objective-C 維護能力。