【问题标题】:Why does a simple program import <Foundation/Foundation.h> instead of individual header files?为什么一个简单的程序会导入 <Foundation/Foundation.h> 而不是单独的头文件?
【发布时间】:2011-03-30 01:46:01
【问题描述】:

我是 Objective-C 的新手。 Xcode生成的模板代码包含:

#import <Foundation/Foundation.h>

当我在/System/Library/Frameworks/Foundation.framework/Headers查看时,有近2000个头文件!

我的问题是,对于只使用 NSString 的非常简单的代码,为什么不只导入 NSString.h 文件?

导入整个 Foundation 框架会影响可执行文件的性能吗?如果没有,它有什么好处吗?

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    它不会影响性能,因为内置框架都安装在您的设备上,已经准备好与您的可执行文件链接。

    当您#import &lt;Foundation/Foundation.h&gt; 时,您的意思是“我想访问 Foundation 框架的功能,即使我没有全部使用它”。它是一种语义划分。

    编译器会针对丢弃未使用的符号进行所有需要做的优化。

    仅在 NSString.h 上进行导入的问题是您知道 NSString 有哪些依赖项。我不知道,也不需要。

    【讨论】:

    • 你不希望 NSString.h 会导入它自己的依赖项吗?
    • @TenMinJoe 是的。它不是世界上最好的书面句子,但它有点明白框架导入是原子的。搞砸了,后果自负。
    【解决方案2】:

    根据您的问题,非常简单的代码如下:

    int main() {
       /* my first program in Objective-C */
      NSLog(@"Hello, World! \n");
       return 0;
    }
    

    只是尝试打印“Hello World”,如果我们不导入foundation.h框架,我们会得到以下错误:

    main.m: In function ‘main’:
    main.m:4:3: warning: implicit declaration of function ‘NSLog’ [-Wimplicit-function-declaration]
       NSLog(@"Hello, World! \n");
       ^~~~~
    main.m:4:3: error: cannot find interface declaration for ‘NSConstantString’
    

    这意味着,执行程序所需的所有基本内容都自动包含在 #import 中。就像在这种情况下 NSLog

    这就像 C 中的 #include&lt;stdio.h&gt; 或 C++ 中的 #inlcude&lt;iostream.h&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 2018-04-09
      • 2017-11-06
      • 2023-03-15
      相关资源
      最近更新 更多