目标c - 导入.m和.h文件 - 它做了什么

时间:2014-04-13 02:40:16

标签: objective-c c compiler-construction import header-files

在目标c中,当您说#import“MyClass.h”时实际发生了什么? (编译器是否为您复制了一些内容?)

  1. 在MyClass.m文件中,如果我#import "UsefulClass.h",这意味着UsefulClass在此文件下可用,我可以创建对象并向其实例发送消息。

  2. 在myClass.m文件中,我必须#import "MyClass.h",这听起来像将我的实现文件链接到它的标题(称为基本文件?),这与第一个文件有很大的不同。 那么#import根据具体情况做两种不同的事情吗?或者它实际上是从另一个角度归入一个类别。

  3. .m文件中定义但不在.h文件中定义的方法被视为私有。从另一个类,我可以以某种方式调用私有方法吗? (比如我#import .m而不是.h?所以类会知道实现文件定义的内容。)

  4. objective-c #import和c #include有什么区别?

  5. 此外,{。1}用于.h文件,@interface MyClass : NSObject用于.m文件。当你想拥有私有属性时,它只是一种语法格式(如括号)吗?或者这背后有什么逻辑吗?

3 个答案:

答案 0 :(得分:2)

  

编译器是否会为您复制一些内容? [当你说#import "myClass.h"]时?

不,它没有。 #import预处理程序指令几乎与#include指令相同,但它不需要inclusion guard - 从C借用的构造,这看起来不直观。

  1. #import .h标头放入.m文件时,可视化最简单的方法是想象该标题的内容全部放在替换#import的行上。从本质上讲,这就是预处理器所做的事情。
  2. 同样的事情发生在#1中 - 如果标题与.m文件相关,则与预处理器无关。
  3. 定义私有方法和私有实例变量的一种更常见的方法是在类扩展中声明它们(参见第5项)。这会保留所有声明的方法,这是一件好事。有一些方法可以在Objective-C中调用私有方法 - 你可以通过反射来实现它,或者你可以通过在不同的类上定义签名来伪造它,然后在你选择的类上调用它。编译器会发出警告,但它应该遵守。
  4. 我在上面提到过,不需要使用#import包含警戒。
  5. 带有空括号的接口是类扩展。它就像一个类别,但它允许您向类中添加实例变量。

答案 1 :(得分:0)

#include以文本方式将指定文件的内容复制到指令出现的位置。类的.h文件包含类的接口声明,因此您要复制类的声明。在这两种情况下(来自班级.m或其他文件),您只是复制声明。

对于#import,它与#include完全相同,只是它会跟踪它所包含的文件,因此您不会在同一类中声明一堆次数。

答案 2 :(得分:0)

.h(标题文件)是您班级的界面,其中包含'一般说明'你的班级当您看到界面时,您可以说出您的课程实际上做了什么。有时界面可能包含一些信息或空白 - 这意味着您的课程可以包含私人方法,您无法通过课程访问它们。接口

.m(objC中的消息文件,或C中的.c,C ++中的.cpp或objC ++中的.mm)是您的类的实现。

1 - >当预处理器看到#import指令时,它会将行#import "UsefulClass.h"替换为文件' UsefulClass.h'的文本,因此您的类MyClass现在已熟悉"熟悉&#34 ;使用类UsefulClass并可以使用其方法或变量。

2 - >请记住,该类始终由接口和实现(.h + .m)组成。这就是为什么你应该在.m文件中导入标题的原因。 因此,#import在第一种情况和第二种情况下做同样的事情。

3 - >是的,您可以访问私有方法。 第一种方式:您可以从类继承,并且它的所有方法(私有和公共)都可以在您的子类中使用。 第二种方式:是的,你可以导入.m文件。 但!所有这些都不推荐。通过协议,您永远不应该访问私有方法。当开发人员制作私有方法时,他必须有充分的理由。总之,objC没有私有方法。 ObjC扩展是私有方法的模仿,所以objC开发人员应该小心。

4 - >建议在ob中使用#include,在objC中使用#import(或现代语言中的@import)。从书中了解适用于OS X和iOS的Mac上的Objective Objective-C'作者:Scott Knaster,Waqar Malik,Mark Dalrymple:

#import保证头文件只包含一次,无论实际看到该文件的#import指令多少次。注意:在C中,程序员通常使用基于#ifdef指令的方案来避免一个文件包含第二个文件的情况,然后递归地包含第一个文件。在Objective-C中,程序员使用#import来完成同样的事情。

5 - > @interface MyClass()是objC类别,其空名称为扩展名(它只是objC概念),请查看文档以了解它。但请记住,它实际上不是私人物品,它只是模仿。