【发布时间】:2011-08-30 07:42:10
【问题描述】:
我刚刚注意到,当我使用 Xcode 中的标准模板(基于视图的应用程序、基于窗口的应用程序等)创建 iPhone 应用程序时,头文件只导入 UIKit.h(而不是 Foundation.h)。因此,如果 Foundation.h 文件没有被导入,如何在程序中使用 NSString、NSArray 等 Foundation 类?它不应该抛出错误吗?
【问题讨论】:
标签: iphone objective-c xcode ios
我刚刚注意到,当我使用 Xcode 中的标准模板(基于视图的应用程序、基于窗口的应用程序等)创建 iPhone 应用程序时,头文件只导入 UIKit.h(而不是 Foundation.h)。因此,如果 Foundation.h 文件没有被导入,如何在程序中使用 NSString、NSArray 等 Foundation 类?它不应该抛出错误吗?
【问题讨论】:
标签: iphone objective-c xcode ios
它被导入到你项目的预编译头文件(扩展名.pch)中。
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#endif
至于为什么UIKit.h 似乎每个文件有两个导入行,因为它也显示在上面,不过,我不太确定。无论如何这都不重要,因为如果第二行 #import 已经包含在预编译的头文件中,它不会导致 UIKit 再次被包含。
【讨论】:
如果您查看一些单独的 UIKit 标头,它们会自己导入 Foundation。正如 BoltClock 所指出的,它也在标准 .pch 中
"The Objective-C Programming Language"中提到了可以放在所有这些地方的原因:
该指令与#include 相同,只是它确保同一个文件不会被多次包含。因此,它是首选,并在整个基于 Objective-C 的文档的代码示例中用于代替 #include。
您要确保需要访问 Foundation 中定义的符号的每个文件都有它们。重复它的原因是它有助于阅读和理解代码;它说“此代码依赖于此标头中的内容”。
【讨论】:
看起来模板文件被设计为使用或不使用预编译头文件,因此它们导入了他们使用的头文件。如果您创建NSObject 的子类,模板文件将 导入Foundation。如果您创建 UIKit 对象的子类,则将导入 UIKit 标头。
好的,那么当只导入UIKit 时,为什么你可以使用NSString 之类的Foundation 类。好吧,几乎所有的UIKit 标头都导入了Foundation.h!
希望这是有道理的。
【讨论】: