Objective c 最佳实践和理由:#以.m或.h输入

Objective c 最佳实践和理由:#以.m或.h输入,objective-c,Objective C,在Objective-C中将#import语句放在.m而不是.h文件中的原因是什么 Apple示例将它们捆绑在.m文件中,除非在接口声明(.h)中使用对象,并且文档声明这是正确的(“在接口文件中,您首先导入任何必需的头文件”) 让我困惑的是.h应该定义实现的接口,因此#import在逻辑上会转到.h文件而不是.m 在Objective-C中将#import语句放在.m而不是.h文件中的原因是什么 也许在实现中的一个方法中,您已经实例化了一个类类型的局部变量,您可能只会使用一次或两次,并且您不希望

在Objective-C中将#import语句放在.m而不是.h文件中的原因是什么

Apple示例将它们捆绑在.m文件中,除非在接口声明(.h)中使用对象,并且文档声明这是正确的(“在接口文件中,您首先导入任何必需的头文件”)

让我困惑的是.h应该定义实现的接口,因此#import在逻辑上会转到.h文件而不是.m

在Objective-C中将#import语句放在.m而不是.h文件中的原因是什么


也许在实现中的一个方法中,您已经实例化了一个类类型的局部变量,您可能只会使用一次或两次,并且您不希望头文件中的
#import
语句杂乱无章。或者您可能在头文件中使用了
@class
作为转发声明,并且您需要在实现中使用
#import
语句引用该类。

如果将所有
#import
放在头文件中,则两个类不能相互依赖,因为文件无法导入导入它的文件。另一方面,如果将
#import
放在实现文件中,问题就会消失。

接口通常只是类提供的方法。一个接口可以有任意数量的可互换实现。在实现内部而不是在标头内部导入会阻止其他实现导入它可能不需要使用的类。它是关于信息隐藏和在需要知道的基础上保存代码。

在任何源文件中,您应该只导入使该文件对编译有效所需的内容。请记住,您的头可能会被其他类使用,因此您希望使它们尽可能轻量级。这也是为什么最好使用@class来转发超类以外的类的声明。

如果类的接口依赖于另一个类的接口(即,如果它是一个子类),则包含头,否则,使用
@class
向前声明另一个类,并将该类的接口头包含在依赖类的源文件中


推理简单;通过仅引用标头中的类而不是导入整个接口,您可以定义相互依赖的类(即相互依赖的类),否则这种设置是不可能的,因为会发生递归文件包含(但Objective-C
#import
确保不会发生这种情况).

除此之外,这也是编译时的性能胜利。当你导入一个文件时,就好像你把文件的内容粘贴到了你的头上。这是编译器在编译代码时需要了解的更多内容

看这个


请注意,对于Cocoa.h这样的标准标题,预编译标题在很大程度上缓解了问题。

谢谢您的回答,所有标题都有有效的分数,所以对所有标题都是+1,并将最有启发性的标题标记为答案。问得好!这个问题的答案对我解决循环依赖问题有很大帮助。