我最后在我的.h和.m文件中都有这些,这是我的第一个Objective-C程序,所以我想澄清一下,以便我可以清理这些东西。
答案 0 :(得分:11)
除非它影响接口定义,否则应将其放在.m文件中。
如果你只是使用一个类,请使用前向声明:
@class AClass;
@interface Bob : NSObject {
AClass* a;
}
如果实施某事,请将其导入:
#import "SomeProtocol.h"
@interface Bob : NSObject<SomeProtocol> {
}
这些东西确实是“最佳实践”,而非绝对必要。 Objective C的#import
指令意味着你不能因为你多次包含一个文件而得到错误,所以它不是技术上一个问题,但它会增加编译时间。
答案 1 :(得分:4)
这些是我遵循的规则:
class
)上使用.h
句子,完全导入定义(.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"
答案 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循环的风险。