Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.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
Iphone 头文件/实现文件就是这样工作的吗?_Iphone_Objective C_Ios - Fatal编程技术网

Iphone 头文件/实现文件就是这样工作的吗?

Iphone 头文件/实现文件就是这样工作的吗?,iphone,objective-c,ios,Iphone,Objective C,Ios,我之前问过这个问题,我一直在阅读答案并搜索有关头文件和实现文件的更多信息。来自Java,我以前从未见过这种分离,我想知道我是否正确理解了它,所以这里是: 在源文件的末尾需要函数声明,这样您就可以使用函数声明,而不依赖于它们在文件中的定义位置。解析器自上而下地读取,不确定这种情况是否仍然存在 它们被移出到自己的文件头中,而不是在实现源中。此头文件包含在预处理器中,由计算机复制/粘贴。头文件也可能包含其他头文件,但我读了一些关于在主文件中包含其他头文件的内容 然后编译源文件。然后它被连接起来。对吗?

我之前问过这个问题,我一直在阅读答案并搜索有关头文件和实现文件的更多信息。来自Java,我以前从未见过这种分离,我想知道我是否正确理解了它,所以这里是:

在源文件的末尾需要函数声明,这样您就可以使用函数声明,而不依赖于它们在文件中的定义位置。解析器自上而下地读取,不确定这种情况是否仍然存在

它们被移出到自己的文件头中,而不是在实现源中。此头文件包含在预处理器中,由计算机复制/粘贴。头文件也可能包含其他头文件,但我读了一些关于在主文件中包含其他头文件的内容


然后编译源文件。然后它被连接起来。对吗?

差不多。IDE用于用C和Java以及动态语言开发解释器,例如Ruby根据类定义(特别是基于公共/私有/受保护修饰符)动态创建给定类中可访问的函数列表。在Objective中,我们没有这些修饰符,或者至少直到最近才有。h文件本质上是一种只列出其他类应该使用的变量和方法的方式

换句话说,编译器使用.h文件缓存其他类可以访问的声明,包括从基类继承这些声明的子类

也就是说,这并不是全部,因为在Objective中,方法是动态调用的。例如,您不需要在.h文件中为另一个类指定声明,以便能够调用仅在.m文件中定义的方法。在Java中,对特定方法的引用在编译时解析。如果一个方法没有定义,那么另一个代码就不能调用它。在ObjectiveC中,当一段代码调用一个方法时,它实际上是在向类发送消息以执行该方法。在执行时,调度器检查对象是否响应该消息,如果响应,则调用该方法。这当然是一种简化。查看Wikipedia页面了解更多详细信息,尤其是部分消息


声明和定义之间的分离来自C。一个函数或变量可能有许多声明,但只有一个定义。当在.m文件的开头导入.h文件时,其内容将在编译期间与这些文件中引用的其他.h文件一起有效地添加到该.m文件中。例如,如果将文件a.m导入到文件b.m和c.m中,那么在编译过程中,b.m和c.m都会有在a.m中定义的变量和方法的重复定义。例如,在a.m中定义的变量将在导入a.m后在b.m或c.m中编译时存储在不同的地址。

基本上您有信息技术对于任何C++编译语言中的独立编译单元,包括C++和Objto-C,编译器更喜欢在使用之前声明每个实体。在某些情况下,它会假定默认值,但并不总是您希望的默认值。但是,如果您必须在单独编译中包含真实代码,以便告诉编译器有关这些实体的信息,那么您将使单独编译方案变得毫无意义,因此您包含的声明是单独编译代码的一种模板。请注意,Java相对不需要这样做。大多数其他编译语言都有一些将接口声明为独立编译单元的要求。在编译源代码时,Java通过从引用实体的.class文件中提取等效信息来解决这个问题。@HotLicks Ok!但是,在将.m/.cpp文件编译为目标代码之后,它们如何找到可能从另一个头文件中包含的函数的定义?链接器如何做到这一点?它是合并到一个大的对象文件中,还是分开保存?每个编译的、可链接的程序文件都包含一个字典,其中列出了它的导出(主要是可调用的函数)。无论是作为单独的链接步骤,还是在执行之前加载iPhone时使用单独的链接,都会查阅此词典,并通过创建从一个编译模块到另一个编译模块的适当指针来解析其中对入口点的引用。实际上,Java中可访问函数的列表是静态的——基本上是在javac时确定的。例如,Eclipse将使用这些定义自动完成或告诉用户某个方法是私有的,不能使用。在C和Visual Studio中也是如此。在XCode中,在.m文件中定义的方法不能在其他.m文件中直接引用,除非在.h文件中明确列出。但它足够聪明,可以自动完成由于消息而可以调用的方法
尽管没有明确声明,但仍会使用默认机制,例如选择器引用的按钮操作。感谢您的更正,公平点。基本上,在Java中,.class文件代表C派生语言中的.h文件,.def代表Modula-2中的.def文件,等等,无论是在IDE中还是在单独编译期间。