Objective-C 擴展 是類別 的匿名變體,主要用於在實現文件(.m)中聲明私有屬性、實例變量和方法。它們對外不可見,是封裝內部實現細節的關鍵機制。
| 特性 | 類別 | 擴展 |
|---|---|---|
| 文件生成 | .h + .m 兩個文件 | 僅 .h 文件(通常內嵌在 .m 中) |
| 可定義屬性/變量 | ❌ 不能定義實例變量 | ✅ 可以定義屬性和實例變量 |
| 繼承性 | 方法可被子類繼承 | 私有,不可繼承 |
| 適用範圍 | 系統類、框架類、自定義類 | 僅自定義類(需訪問 .m 文件) |
| 語法聲明 | @interface Class (Name) | @interface Class () |
| 本質 | 運行時動態添加方法 | 編譯期合併到主類定義 |
#import <Foundation/Foundation.h> @interface Person : NSObject - (instancetype)initWithName:(NSString *)aName; - (void)print; @property (nonatomic, strong) NSString *name; @end
#import "Person.h"
// === 擴展聲明(私有部分)===
@interface Person ()
@property (nonatomic, assign) int age; // 私有屬性
- (void)printName; // 私有方法
- (void)printAge;
@end
// === 實現部分 ===
@implementation Person
- (instancetype)initWithName:(NSString *)aName {
self = [super init];
if (self) {
self.name = aName;
self.age = 23; // 設置私有屬性
}
return self;
}
- (void)print {
NSLog(@"Person print");
[self printName]; // 內部調用私有方法
[self printAge];
}
// 擴展方法實現
- (void)printName {
NSLog(@"name: %@", self.name);
}
- (void)printAge {
NSLog(@"age: %d", self.age);
}
@end
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *jack = [[Person alloc] initWithName:@"Jack"];
[jack print]; // 正常調用
// [jack printName]; // 編譯錯誤:私有方法不可見
// jack.age = 25; // 編譯錯誤:私有屬性不可見
}
return 0;
}
Person print name: Jack age: 23