| 特性 | @class (前向聲明) | #import (引入頭文件) |
|---|---|---|
| 編譯器知識 | 知道類名存在 | 知道類的完整定義 (屬性、方法、繼承關係) |
| 可用操作 | 聲明指針/引用:Engine *engine; | 訪問成員:engine.price, [engine start] |
| 編譯依賴 | 極低,不觸發連鎖重編譯 | 高,頭文件變更導致所有引用者重編譯 |
| 循環引用 | 解決 A→B, B→A 互相引用 | 會導致編譯錯誤 |
// Person.h
@class Woman, Man; // 僅聲明類名
@interface Person : NSObject {
Woman *woman;
Man *man;
}
@property (nonatomic, strong) Woman *woman;
@property (nonatomic, strong) Man *man;
@end
// Person.m
#import "Person.h"
#import "Woman.h" // 這裡需要完整定義
#import "Man.h"
@implementation Person
- (void)someMethod {
self.woman.name = @"Alice"; // 訪問屬性需導入頭文件
[self.man doSomething];
}
@end
#import <Framework/Header.h>:系統框架頭文件,搜索系統路徑#import "MyHeader.h":項目自有頭文件,優先搜索當前目錄,再搜索系統路徑若 100 個文件 #import "Common.h",修改 Common.h 觸發 100 個文件重編譯。改用 @class 只需重編譯實現文件。
// A.h
#import "B.h" // 錯誤:B.h 又 import A.h → 無限遞歸
@interface A { B *b; }
@end
// 正確:
// A.h: @class B; @interface A { B *b; } @end
// B.h: @class A; @interface B { A *a; } @end
// A.m: #import "B.h"
// B.m: #import "A.h"
// 繼承父類、遵循協議、分類擴展 必須 #import @interface Child : Parent <SomeProtocol> // 需要知道 Parent 內存佈局、協議方法列表 // @class Parent; // 不夠! #import "Parent.h" #import "SomeProtocol.h"
@class 就用,僅聲明指針/屬性類型#import 所有用到的類頭文件#import