首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

Objective-C @class vs #import 區別與最佳實踐

     編輯:C++ 入門

核心區別

特性@class (前向聲明)#import (引入頭文件)
編譯器知識知道類名存在知道類的完整定義 (屬性、方法、繼承關係)
可用操作聲明指針/引用:Engine *engine;訪問成員:engine.price, [engine start]
編譯依賴極低,不觸發連鎖重編譯高,頭文件變更導致所有引用者重編譯
循環引用解決 A→B, B→A 互相引用會導致編譯錯誤

標準用法模式

.h 頭文件:用 @class

// Person.h
@class Woman, Man;  // 僅聲明類名

@interface Person : NSObject {
    Woman *woman;
    Man *man;
}
@property (nonatomic, strong) Woman *woman;
@property (nonatomic, strong) Man *man;
@end

.m 實現文件:用 #import

// Person.m
#import "Person.h"
#import "Woman.h"  // 這裡需要完整定義
#import "Man.h"

@implementation Person
- (void)someMethod {
    self.woman.name = @"Alice";  // 訪問屬性需導入頭文件
    [self.man doSomething];
}
@end

#import <> vs #import ""

  • #import <Framework/Header.h>:系統框架頭文件,搜索系統路徑
  • #import "MyHeader.h":項目自有頭文件,優先搜索當前目錄,再搜索系統路徑

深度原理分析

1. 編譯效率

若 100 個文件 #import "Common.h",修改 Common.h 觸發 100 個文件重編譯。改用 @class 只需重編譯實現文件。

2. 循環依賴

// 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"

3. 繼承/協議需完整定義

// 繼承父類、遵循協議、分類擴展 必須 #import
@interface Child : Parent <SomeProtocol>  // 需要知道 Parent 內存佈局、協議方法列表
// @class Parent; // 不夠!
#import "Parent.h"
#import "SomeProtocol.h"

最佳實踐清單

  1. .h 中:能用 @class 就用,僅聲明指針/屬性類型
  2. .m 中:必須 #import 所有用到的類頭文件
  3. 繼承/協議/分類:.h 中也必須 #import
  4. 項目規範:統一風格,Code Review 時檢查冗餘 import
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved