8

在 Objective-c 中,当我们按照约定将一个类的对象用于另一个类时,我们应该在 .h 文件中转发声明该类,即@class classname;. 并且应该在 .m 文件中导入头文件,即#import "header.h". 但是如果我们在 .h 中导入头文件,那么我们不必在 .m 文件中再次导入它。那么这个约定背后的原因是什么?哪种方式有效?

4

5 回答 5

16

那么这个约定背后的原因是什么?

@class MONClass;您应该在可能的情况下支持前向声明#import(依赖关系并增加构建时间。

哪种方式有效?

转发声明。如果您正确执行此操作,您的构建、重建和索引编制将会快得多。

于 2012-05-10T10:16:47.023 回答
4

您是正确的,在 .h 中导入标头会更容易(在短期内)。不这样做并将其导入实现文件 (.m) 的原因是为了防止名称污染,当有人导入您的标头时,导入标头中的所有名称都可用。相反,通过导入您的标头,只有您的函数/类应该被导入,其余的在实现中

此外,如果您在 .h 中导入标头,这意味着当第 3 方标头更改时,导入标头的每个代码都必须重新编译,即使您的标头中没有显式更改。前向声明避免了这个问题,并且只强制重新编译那些实际使用 3rd-party 标头的实现 (.m) 文件

于 2012-05-10T10:13:13.360 回答
2

尽管在 .m 中导入文件可以更轻松地使用几行代码,但一般认为导入可能会影响加载时间和响应时间,是的,它确实会影响并且不会。因为根据苹果的文档:-

如果您担心包含主头文件可能会导致您的程序膨胀,请不要担心。因为 Mac OS X 接口是使用框架实现的,所以这些接口的代码驻留在动态共享库中,而不是在您的可执行文件中。此外,只有您的程序使用的代码在运行时才会加载到内存中,因此您的内存占用空间同样很小。

至于编译时包含大量的头文件,再一次,不用担心。Xcode 提供了一个预编译头工具来加快编译时间。通过一次编译所有框架头文件,除非您添加新框架,否则无需重新编译头文件。同时,您可以使用包含的框架中的任何接口,而几乎没有或没有性能损失。

因此响应和加载时间仅在第一次受到影响,但无论如何,前向引用应该有利于维护编码标准并避免开销,无论多么小:)。

于 2012-05-10T11:13:51.210 回答
0

#import是在编译器看到文件之前对文件进行操作的预处理器指令。每当您感到困惑时,在概念上将其视为复制和粘贴:当您看到 时#import foo,意味着文件 foo 的内容被插入到该点。(它比这更聪明一点,因为它还可以防止重复包含)。

因此#import Foo.h,如果该引用Bar.h中有声明,您将在其中。如果没有使用 Foo 的内容,但有,则导入进入. 仅在需要的地方保留声明。Bar.hFoo.hBar.hBar.mBar.m

于 2012-05-10T10:17:05.247 回答
-1

这只是说编译器我们有一个名为 xx 的类,如果你使用 @class xx;

因为您现在不需要它的属性/方法。

在下一种情况下,您还需要属性和方法,因为您必须访问它们。如果您在 .h 文件中使用 @class xx 并且不导入 xx.h,这就是问题所在。然后声明 xx 的对象不会产生错误,但访问它的方法会产生警告,访问属性会产生错误

于 2012-05-10T10:11:47.277 回答