2010-12-01 42 views
3

我最終在.h和.m文件中都有這些,這是我的第一個Objective-C程序,所以我想澄清一下,這樣我就可以清理乾淨的東西了。#在.m或.h中導入語句在objective-c中?

+0

可能出現[將#import放入.h或.m文件中?](http://stackoverflow.com/questions/2770243/do-you-put-import-s-in-h-或m文件) – 2016-09-15 14:11:45

回答

11

除非它影響接口定義,否則你應該把它放在.m文件中。

如果你只是使用類,使用前向聲明:

@class AClass; 

@interface Bob : NSObject { 
    AClass* a; 
} 

如果實現的東西,然後將其導入:

#import "SomeProtocol.h" 

@interface Bob : NSObject<SomeProtocol> { 
} 

這些類型的東西是真的「最佳實踐「而不是絕對必要的。 Objective C的#import指令意味着你不能得到錯誤,因爲你多次包含一個文件,所以它不是在技術上有問題,但會增加編譯時間。

4

這是我遵循的規則:

  1. 如果你的頭文件,你只需要使用指針中要包括的頭文件中聲明類,那麼我只想用一個class句子上頭文件(.h)和全定義文件(.m)上的導入。
  2. 如果您需要使用包含的頭文件中某些東西的完整定義,那麼完整的導入將進入頭文件。

爲例子,認爲文件MyClass.mMyClass.hMyInclude.h

舉例,場景#1:

// MyClass.h 
@class MyInclude; 

@interface MyClass : NSObject { 
    MyInclude *myIncludeObj; 
} 

// MyClass.m 
#import "MyClass.h" 
#import "MyInclude.h" 

的exaple,場景#2:

// MyClass.h 
#import "MyInclude.h" 
@interface MyClass : NSObject { 
    MyInclude myIncludeObj; // MyInclude could be a plain C structure 
} 

// MyClass.m 
#import "MyClass.h" 
+0

它應該是@class,而不僅僅是class。 – 2010-12-01 15:27:32

0

最佳實踐將#import語句放在.m文件中。如果您需要訪問的頭文件中的一類,對於財產申報或函數參數,使用前聲明,就像這樣:

@class Cocos2DController; 

@interface HoppersAppDelegate : NSObject <UIApplicationDelegate> { 
Cocos2DController* controller; 
} 

正向聲明讓系統知道的類存在,儘管它尚未完全定義。使用這種模式,您可以保持標題精簡,並確保只導入特定類所需的標題,而不是通過應用程序鏈接#import。

對於您可能遇到的特定問題:如果在頭文件中包含#import語句,如果兩個類導入彼此的頭文件,就會冒#import循環的風險。

1

#import指令是對#include指令的改進,因爲它並不是盲目地複製文件,如果它已包含在內,它將不包含它。因此,您應該不會遇到#多次導入相同文件的問題。

就最佳實踐而言,恕我直言,最好儘量縮小範圍。因此,我建議將#imports放在你的實現文件(.m)中。如果您需要接口文件(.h)中的類定義,那麼您可以使用@class MyClass;

構造通知編譯器它將能夠在實現文件中找到相關頭文件。

希望這會有所幫助。

1

我只有一條規則:導入超類的.h文件的頂部,以及在.h文件中聲明的任何類的協議。這是因爲任何導入.h文件的文件都需要超類和協議的聲明。這也是爲什麼默認的Xcode模板在.h文件中有#import <UIKit/UIKit.h>而不是.m文件。

對於一切(用於實例變量和方法參數如類型)時,向前聲明和把#進口的.m文件

另一種方法把這種爲:從來沒有使用前置聲明爲超和協議。