和Objective-C刚刚诞生时相比,现在的Objective-C中,类的数量已经非常庞大,有必要将类按照功能纳入框架中管理。在之前的代码中,通常会在头文件中导入Foundation框架:
#import <Foundation/Foundation.h>
代码会导入Foundation框架中的所有头文件:
#import <Foundation/NSArray.h>
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSBundle.h>
#import <Foundation/NSByteOrder.h>
#import <Foundation/NSCalendar.h>
#import <Foundation/NSCharacterSet.h>
...
这样,文件中就不用再明确导入Foundation框架中的任何类了。编译器会使用C语言的预处理器将所有需要的头文件拷贝到文件中。
直接导入整个框架的方式开始可以满足要求,但是随着框架中的类以及项目中需要使用的框架越来越多,编译器也会花费越来越长的时间处理大量重复的头文件。为了解决这个问题,Xcode为所有项目都添加了一个预编译头文件(precompiled header file),第一次编译项目时,预编译头文件中列出的文件会被编译并缓存,编译器会重复使用缓存结果快速编译项目中的其他文件。之前创建的RandomItems项目有一个RandomItems-Prefix.pch文件,编译器会预编译该文件中列出的Foundation框架:
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#endif
在预编译头文件中,仍然需要明确导入Foundation框架。
这种方式在一段时期内很好地满足了Objective-C程序员对编译速度的要求,但是Apple近期发现在项目中维护。pch文件低效耗时,因此继续优化编译器并引入了@import指令:
@import Foundation;
这行代码告诉编译器需要使用Foundation框架,之后编译器会优化预编译头文件和缓存编译结果的过程。同时,文件中不用再明确引用框架——编译器会根据@import自动导入相应的框架。
目前只有Apple提供的框架可以使用@import。如果需要导入自己编写的类和框架,只能使用#import。
在写作本书时,Xcode 5.0.2的模板文件仍然使用#import,但是可以肯定,未来@import的使用将会越来越多。