在Objective-C中,在每个类中导入相同的头文件会使编译时间更长?

时间:2012-06-06 07:39:08

标签: iphone objective-c ios header

我是Objective-C / iOS编程的初学者。

我想制作一个包含我在项目中使用的所有类标题的头文件 并在每个类头文件中导入标头。

喜欢这个问题:
Including multiple classes in the same header file

但这种方法是否会增加编译时间? 或者还有其他缺点吗?

请告诉我导入标题的好方法。

5 个答案:

答案 0 :(得分:24)

通常,新生成的iOS项目具有此功能,称为预编译头前缀头,并且是一个扩展名为{{ 1}}。

你可以在那里抛出你想要的所有头文件,Xcode会在构建其他内容之前预先编译它,并使用它来编译项目中的其他编译单元(例如.pch文件)。

使用预编译头可能会也可能不会增加编译时间;一般来说,只要你有很多常见的标题和/或大量的源文件,它就会缩短编译时间。

然而,将预编译的头部视为一个大的倾销场并不一定是好的做法,因为当你想要在组件之间强制松散耦合时,你的编译单元可以形成对各种东西的隐式依赖。

答案 1 :(得分:7)

一个标题中所有类的问题是,每次更改类标题时,所有包含它的文件甚至间接都需要重新编译,而如果只导入所需的类,并且在使用时也使用@class然后只能重新编译直接使用该类的文件。因此,在第一种情况下,将会有比后者更多的汇编。这是我建议开始的方式。

但是,当您的代码变得更稳定且类没有更改时,将它们全部放在一个头中可以缩短编译时间,因为预编译头将包含每个文件的相同信息。我要做的是当代码没有变化时,将成熟的类放入Framework中,Framework头将包含所有这些类。

答案 2 :(得分:6)

您可以在项目prefix_pch文件中导入该头文件。然后您可以在您的类中使用它。

答案 3 :(得分:4)

如果要全局导入标头,则应在YourProject-Prefix.pch文件中执行此操作。看起来应该是这样的......

#import <Availability.h>

#ifndef __IPHONE_4_0
#warning "This project uses features only available in iOS SDK 4.0 and later."
#endif

   #ifdef __OBJC__
   #import <UIKit/UIKit.h>
   #import <Foundation/Foundation.h>
   #import "YourGlobalHeader.h"
#endif

现在,您的所有课程都已自动导入YourGlobalHeader.h

答案 4 :(得分:0)

将所有标题放在一个文件中可能会在某些情况下提高构建性能,但您可能不会注意到差异。

为了组织起见,最好将类标题保存在不同的文件中。此外,如果您只在源文件中包含所需的标题,那么您的构建时间将会缩短,但如果您使用的是合适的构建计算机,则不会显着。