Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 转发关于@class的类声明_Objective C_Ios - Fatal编程技术网

Objective c 转发关于@class的类声明

Objective c 转发关于@class的类声明,objective-c,ios,Objective C,Ios,我知道在.h中提出类声明(@class ClassA)并在.m中导入“ClassA.h”是正确的做法。而且我知道这样做可以使编译器在以后编译它(直到#将它导入到.m中) 通常我们在A.h中使用@class ClassA,同时在A.m中添加#import ClassA.h,虽然编译器不会在A.h中编译ClassA,但编译器必须在A.m中编译它。 那么为什么不直接在A.h中使用#import呢?在A.h中几乎从不使用@Class A。通常的做法是在A.h中使用@Class B,在B.h中使用@Cla

我知道在.h中提出类声明(@class ClassA)并在.m中导入“ClassA.h”是正确的做法。而且我知道这样做可以使编译器在以后编译它(直到#将它导入到.m中)

通常我们在A.h中使用@class ClassA,同时在A.m中添加#import ClassA.h,虽然编译器不会在A.h中编译ClassA,但编译器必须在A.m中编译它。
那么为什么不直接在A.h中使用#import呢?

在A.h中几乎从不使用
@Class A
。通常的做法是在A.h中使用
@Class B
,在B.h中使用
@Class A
。这样做的原因是为了避免.h文件中的循环依赖。如果A.h导入了B.h,B.h导入了A.h,编译器将从循环依赖中爆炸

你的最后一句话似乎在问为什么我们从来没有在A.h.中导入A.h.我认为很明显为什么没有这样做

记住,头文件(.h)是为了告诉世界关于您的声明的最小可能值。它在那里告诉编译器-“嘿,我们有一个类(@interface)使用一些方法和属性。这些方法使用这些其他类。我们使用@class作为这些其他类,因为此时我们只需要知道最终会有这样的类。这足以让编译器满意,这样它就可以完成它的工作。最终,链接器决定这些类是否ses确实存在于某个地方

源文件(.m)需要进行实际导入,因为编译器需要验证是否确实存在您尝试使用的方法和属性。但是头文件不调用方法,也不调用属性。它只是声明“此内容存在”。

我使用@class而不是#import in.h,原因有两个:

  • 使循环依赖成为可能

  • 减少编译时间

  • 我通常发现有相互链接很有用,A->B和B->A,如果没有转发声明,这是不可能的