在目标c中,当您说#import“MyClass.h”时实际发生了什么? (编译器是否为您复制了一些内容?)
在MyClass.m文件中,如果我#import "UsefulClass.h"
,这意味着UsefulClass
在此文件下可用,我可以创建对象并向其实例发送消息。
在myClass.m文件中,我必须#import "MyClass.h"
,这听起来像将我的实现文件链接到它的标题(称为基本文件?),这与第一个文件有很大的不同。
那么#import
根据具体情况做两种不同的事情吗?或者它实际上是从另一个角度归入一个类别。
.m文件中定义但不在.h文件中定义的方法被视为私有。从另一个类,我可以以某种方式调用私有方法吗? (比如我#import .m而不是.h?所以类会知道实现文件定义的内容。)
objective-c #import
和c #include
有什么区别?
此外,{。1}用于.h文件,@interface MyClass : NSObject
用于.m文件。当你想拥有私有属性时,它只是一种语法格式(如括号)吗?或者这背后有什么逻辑吗?
答案 0 :(得分:2)
编译器是否会为您复制一些内容? [当你说
#import "myClass.h"
]时?
不,它没有。 #import
预处理程序指令几乎与#include
指令相同,但它不需要inclusion guard - 从C借用的构造,这看起来不直观。
#import
.h标头放入.m文件时,可视化最简单的方法是想象该标题的内容全部放在替换#import
的行上。从本质上讲,这就是预处理器所做的事情。#import
包含警戒。答案 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概念),请查看文档以了解它。但请记住,它实际上不是私人物品,它只是模仿。