我刚刚注意到,当我使用Xcode(基于视图的应用程序,基于窗口的应用程序等)中的标准模板创建iPhone应用程序时,头文件仅导入UIKit.h(而不是Foundation.h)。因此,如果Foundation.h文件没有被导入,那么如何在程序中使用NSString,NSArray等基础类?它不应该抛出一个错误?为什么Foundation.h不能在标准Xcode模板中导入?
4
A
回答
7
它被导入到项目中的预编译头文件(扩展名.pch
)中。
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#endif
至于为什么UIKit.h
似乎有每个文件的两个导入线,因为它上面也显示了,不过,我也不太清楚。无论如何,这应该无关紧要,因为如果第二个#import
行已经包含在预编译头文件中,它们将不会再次包含UIKit。
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
!
希望这是有道理的。
相关问题
- 1. 为什么我不能在标准模式下更改光标?
- 2. 模板函数作为模板参数,标准是什么?
- 3. 为什么iOS模板不会出现在Xcode中?
- 4. 为什么Testflight中的crashlog不符合Xcode标准?
- 5. 标准库和标准模板库有什么区别?
- 6. 为什么导入python模块不导入嵌套模块?
- 7. 为什么我不能导入pg.py?
- 8. 为什么spyder不能导入tensorflow
- 9. 为什么我不能导入“models.User”?
- 10. 为什么我不能导入geopandas?
- 11. 为什么不能导入文件?
- 12. 为什么我不能导入tensorflow
- 13. 为什么我不能导入pygtk?
- 14. 为什么我不能导入sklearn
- 15. 为什么我不能导入android.os.StrictMode?
- 16. 为什么我不能导入nltk?
- 17. 为什么我不能导入org.apache.spark.sql.DataFrame
- 18. 为什么模板模板参数不能按预期工作?
- 19. 为什么在这个模板函数中不能推导出类型?
- 20. 为什么在此折叠实现中不能推导出模板参数?
- 21. 为什么我不能在控件模板中使用模板绑定?
- 22. 为Cocoa导入<Foundation/Foundation.h>时导入的文件?
- 23. 为什么我不能在C++中使用模板化的typedefs?
- 24. 为什么不能在包含模板Laravel中转换?
- 25. 为什么模板函数不能显示在LLVM-IR中?
- 26. 为什么图像不能在Twig模板中加载?
- 27. 为什么不能导入一些python子模块?
- 28. 为什么我不能导入这个模块
- 29. 为什么我不能导入Qt3D模块?
- 30. 在模板中导入HTML模板
那么UIKit/UIKit.h也是在预编译头文件中导入的。为什么它再次导入到我们的头文件中? – NSExplorer 2011-05-21 18:08:51
就像我说的我不确定。这是一个非常好的问题。 – BoltClock 2011-05-21 18:19:17