繁体   English   中英

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

[英]#import statements in .m or .h in objective-c?

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

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

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

@class AClass;

@interface Bob : NSObject {
  AClass* a;
}

如果你实现了什么,那么导入它:

#import "SomeProtocol.h"

@interface Bob : NSObject<SomeProtocol> {
}

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

这些是我遵循的规则:

  1. 如果在头文件中,你只需要使用指向你所包含的头文件中声明的类的指针,那么我只需在头文件( .h )上使用一个class句子并在定义( .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"

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

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

@class MyClass;

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

希望这可以帮助。

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

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

另一种方法是: 永远不要使用超类和协议的前向声明。

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

@class Cocos2DController;

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM