我刚才注意到,当我在Xcode(基于视图的应用程序,基于窗口的应用程序等)中使用标准模板创建iPhone应用程序时,头文件只导入UIKit.h(而不是Foundation.h)。因此,如果未导入Foundation.h文件,如何在程序中使用NSString,NSArray等基础类?不应该抛出错误吗?
答案 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
时可以使用NSString
类UIKit
类。几乎所有UIKit
标头导入Foundation.h
!
希望这是有道理的。