在Objective-c中的.m或.h中的#import语句?

时间:2010-12-01 15:12:54

标签: iphone objective-c ipad

我最后在我的.h和.m文件中都有这些,这是我的第一个Objective-C程序,所以我想澄清一下,以便我可以清理这些东西。

5 个答案:

答案 0 :(得分:11)

除非它影响接口定义,否则应将其放在.m文件中。

如果你只是使用一个类,请使用前向声明:

@class AClass;

@interface Bob : NSObject {
  AClass* a;
}

如果实施某事,请将其导入:

#import "SomeProtocol.h"

@interface Bob : NSObject<SomeProtocol> {
}

这些东西确实是“最佳实践”,而非绝对必要。 Objective C的#import指令意味着你不能因为你多次包含一个文件而得到错误,所以它不是技术上一个问题,但它会增加编译时间。

答案 1 :(得分:4)

这些是我遵循的规则:

  1. 如果在头文件中,您只需要使用指向您所包含的头文件中声明的类的指针,那么我只需在头文件(class)上使用.h句子,完全导入定义(.m)文件。
  2. 如果您需要在包含的头文件中使用某些内容的完整定义,则完全导入会进入头文件。
  3. 对于示例,请考虑文件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"
    

答案 2 :(得分:1)

#import指令是对#include指令的改进,因为它不是盲目地复制文件,如果已经包含它,它将不包括它。因此,您不应该多次#导入同一个文件时遇到任何问题。

就最佳做法而言,恕我直言,最好尽量缩小范围。因此,我建议将#imports放在实现文件(.m)中。如果在接口文件(.h)中需要类定义,则可以使用

@class MyClass;

构造通知编译器它将能够在实现文件中找到相关的头。

希望这有帮助。

答案 3 :(得分:1)

我只有一条规则:在.h文件的顶部导入您在.h文件中声明的任何类的超类和协议。这是因为导入.h文件的任何文件都需要超类和协议的声明。这也是默认的Xcode模板在.h文件而不是.m文件中有#import <UIKit/UIKit.h>的原因。

对于其他所有内容(例如用于ivars和方法参数的类型),使用forward-declarations并将#import放在.m文件中

另一种说法是:从不使用超类和协议的前向声明。

答案 4 :(得分:0)

最佳做法是将#import语句放在.m文件中。如果需要访问头文件中的类,对于属性声明或函数参数,请使用前向声明,如下所示:

@class Cocos2DController;

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

前向声明让系统知道该类存在,但尚未完全定义。使用此模式,您将保持标头精简,并保证您只导入特定类所需的标头,而不是在整个应用程序中链接#imports。

对于您可能遇到的特定问题:如果在头文件中包含#import语句,则如果两个类导入彼此的头文件,则存在#import循环的风险。