2011-05-21 54 views
4

我刚刚注意到,当我使用Xcode(基于视图的应用程序,基于窗口的应用程序等)中的标准模板创建iPhone应用程序时,头文件仅导入UIKit.h(而不是Foundation.h)。因此,如果Foundation.h文件没有被导入,那么如何在程序中使用NSString,NSArray等基础类?它不应该抛出一个错误?为什么Foundation.h不能在标准Xcode模板中导入?

回答

7

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

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

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

+1

那么UIKit/UIKit.h也是在预编译头文件中导入的。为什么它再次导入到我们的头文件中? – NSExplorer 2011-05-21 18:08:51

+0

就像我说的我不确定。这是一个非常好的问题。 – BoltClock 2011-05-21 18:19:17

2

如果你看看一些单独的UIKit头文件,他们自己导入Foundation。作为BoltClock指出,它也是标准的.PCH

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

这个指令是相同的#包括,除了它确保相同的文件不会被多次包含。因此它是首选,并在整个基于Objective-C的文档的代码示例中用来代替#include。

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

2

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

好的,那么为什么只有UIKit被导入时,才能使用Foundation类如NSString。几乎所有的UIKit标题都会导入Foundation.h

希望这是有道理的。