为什么Foundation.h没有在标准Xcode模板中导入?

时间:2011-05-21 18:01:16

标签: iphone objective-c xcode ios

我刚才注意到,当我在Xcode(基于视图的应用程序,基于窗口的应用程序等)中使用标准模板创建iPhone应用程序时,头文件只导入UIKit.h(而不是Foundation.h)。因此,如果未导入Foundation.h文件,如何在程序中使用NSString,NSArray等基础类?不应该抛出错误吗?

3 个答案:

答案 0 :(得分:8)

它会导入项目中的预编译头文件(扩展名.pch)。

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

至于为什么UIKit.h每个文件似乎有两个导入行,因为它也显示在上面,但是,我不太确定。无论如何,它应该无关紧要,因为如果第二个#import行已经包含在预编译的头文件中,它将不会再次包含UIKit。

答案 1 :(得分:2)

如果您查看一些单独的UIKit标头,他们自己导入Foundation。正如BoltClock所说,它也在标准的.pch

"The Objective-C Programming Language"中提到 可以放在所有这些地方的原因:

  

该指令与#include相同,只是它确保同一个文件永远不会被包含多次。因此,它是首选的,并且在基于Objective-C的文档中的代码示例中用于代替#include。

您希望确保需要访问Foundation中定义的符号的每个文件都具有这些文件。重复的原因是它有助于阅读和理解代码;它说“这段代码依赖于此标题中的内容”。

答案 2 :(得分:2)

看起来模板文件设计为使用或不使用预编译头文件,因此它们会导入他们使用的头文件。如果您创建NSObject的子类,则模板文件导入Foundation。如果您创建UIKit对象的子类,则将导入UIKit标头。

好的,那么为什么在导入Foundation时可以使用NSStringUIKit类。几乎所有UIKit标头导入Foundation.h

希望这是有道理的。