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

在目标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. 另外@interface MyClass : NSObject在.h文件中使用@interface MyClass : NSObject ,在.m文件中使用@interface MyClass() 。 当你想拥有私有属性时,它只是一种语法格式(如括号)吗? 或者这背后有什么逻辑吗?

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

不,不是的。 #import预处理程序指令几乎与#include指令相同,但它不需要包含保护 – 一个从C借用的结构,这看起来并不直观。

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

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

对于#import ,它与#include完全一样,除了它跟踪它所包含的文件所包含的内容,因此你最终不会被声明一堆相同的类。

.h(头文件)是您class级的界面,包含您class级的“一般描述”。 当您看到界面时,您可以说出您的课程实际上做了什么。 有时接口可能包含一些信息或为空 – 这意味着您的类可以包含私有方法,您无法通过类’接口访问它们。

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

1 – >当预处理器看到#import指令时,它将#import "UsefulClass.h"行替换为’UsefulClass.h’文件的文本,所以你的类MyClass现在“熟悉”类UsefulClass并且可以使用它方法或变量。

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

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

4 – >建议在ob中使用#include,在objC中使用#import(或现代语言中的@import)。 来自Scott Knaster,Waqar Malik,Mark Dalrymple的“在Mac上为OS X和iOS学习Objective-C”一书:

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

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