在目标c中导入标题

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

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

你应该在可能的情况下使用forward声明( @class MONClass; ),因为编译器在使用之前需要知道typename是一个objc类,并且因为#import可以拖入大量的其他头文件(例如整个框架/库) ,严重扩展和复杂化你的依赖关系,并增加你的构build时间。

哪个是有效的方法?

前向声明。 如果您正确地做到这一点,您的构build,重build和索引将会更快。

在.h中导入标题就像在短期内更容易一样。 不这样做并将其导入到实现文件(.m)中的原因是为了防止名称污染,其中导入标头中的所有名称在有人导入标头时都可用。 相反,通过导入你的头只有你的函数/类shuld被导入,其余的在执行

另外,如果你在.h中导入头文件,这意味着即使没有明确地改变你的头文件,每一个导入头文件的代码都必须在第三方头文件改变时重新编译。 前向声明避免了这个问题,并强制只重新编译那些实际使用第三方头文件的实现(.m)文件

尽pipe在.m中导入文件使得用几行代码就可以轻松取消,但是一般认为导入可能会影响加载时间和响应时间,是的,它影响和不影响。因为根据苹果的文档:

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

至于在编译过程中包含大量的头文件,再次不要担心。 Xcode提供了一个预编译头文件来加快编译时间。 通过一次编译所有的框架头文件,除非添加新的框架,否则不需要重新编译头文件。 与此同时,您可以使用包含的框架中的任何接口,而不会影响性能。

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

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

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

在下一个案例中,您还需要您必须访问的属性和方法。 如果你在你的.h文件中使用@class xx而不导入xx.h,那就是问题了。 那么声明一个xx的对象不会产生错误,但是访问它的方法会产生警告,访问权限会产生错误

#import是一个预处理器指令,在编译器看到它之前在文件上运行。 每当你感到困惑的时候,从概念上来看,就像复制粘贴一样:当你看到#import foo ,表示文件foo的内容被插入到这个点上。 (这比它更聪明,因为它也防止重复包括)。

所以,如果Bar.h有引用Foo.h声明,那么你在#import Foo.hBar.h Foo.h 如果Bar.h中没有任何Bar.h使用Foo,但是有Bar.m ,则导入进入Bar.m 保持声明只在他们需要的地方。

Interesting Posts