我之前问过这个问题,我一直在阅读答案,并搜索了有关标题和实现文件的更多信息。来自Java我以前没有见过这种分离,我想知道我是否理解它,所以这就是:
源文件需要函数声明,因此您可以使用函数声明,而不必考虑它们在文件中的定义位置。解析器自上而下读取(不确定是否再次出现这种情况?)
不是将它们放在实现源中,而是将它们移出到自己的文件(Header)。此头文件包含在预处理器中,并由机器复制/粘贴。头文件也可能包含其他标题,但我读了一些关于在主文件中包含其他标题的内容吗?
然后编译源文件。然后它是相互关联的。这是对的吗?
答案 0 :(得分:0)
差不多。 IDE用于开发C#和Java(在动态语言中也是解释器,例如Ruby)动态创建一个函数列表,这些函数可以根据类定义在特定的类中访问(特别是基于public / private / protected modifiers) 。在ObjectiveC中,我们没有那些修饰符(或者至少直到最近),而.h文件本质上只是列出那些应该由其他类使用的变量和方法。
换句话说,编译器使用.h文件来缓存其他类(包括从基类继承这些声明的子类)可访问的声明。
那就是说,这不是全局,因为ObjectiveC方法是动态调用的。例如,您不需要在.h文件中为另一个类指定声明,以便能够调用仅在.m文件中定义的方法。在Java中,在编译时解析对特定方法的引用。如果未定义方法,则另一个代码无法调用它。在ObjectiveC中,当一段代码调用一个方法时,它实际上是向类发送一条消息来执行该方法。在执行时,调度程序检查对象是否响应该消息,如果是,则调用该方法。这当然是一种简化。查看有关ObjectiveC的维基百科页面了解更多详情(尤其是消息部分)。
声明和定义之间的分离来自C.一个函数或变量可能有许多声明但只有一个定义。当.h文件在.m文件的开头导入时,其内容在编译期间有效地添加到该.m文件中(与这些文件中引用的其他.h文件一起)。如果要将文件a.m
导入到文件b.m
和c.m
,那么在编译期间,b.m
和c.m
都会有重复的变量和方法定义在a.m
中定义的{例如a.m
中定义的变量将在导入a.m
时存储在不同的地址,然后在b.m
或c.m
中编译。