[英]#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
指令意味着你不能因为你多次包含一个文件而得到错误,所以它在技术上不是问题,但它会增加编译时间。
这些是我遵循的规则:
.h
)上使用一个class
句子并在定义( .m
)文件中使用完全导入。 对于示例,请考虑文件MyClass.m
, MyClass.h
和MyInclude.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.