我是iphone开发的新手,我有点问题。 我的问题是我们什么时候在.h(header)文件中使用@class和#import。如果你的答案是@class你可以创建实例但不能..使用它的方法并在.h文件中使用#import我们可以访问第二类的所有方法和变量。然后我的问题是 如果#import包含优势,那么为什么很多人只在他们的.h文件中使用@class。
请有人回答然后尽快回复。谢谢。
答案 0 :(得分:4)
首先,你的假设是对的。 至于优点: @class指令更快,因为它只公开了Name,以及对Namespace的继承(例如Header文件)。但#import会加载所有内容,因此速度较慢,意味着系统负载更重。如果您的代码是另一个系统的库,如果头文件只加载类名(@class)
,它非常有用举个例子。您有A类,并从库中导入Headerfile B. B本身想要使用C.如果它导入B Header文件中的所有数据,它会变得臃肿,因为在将头文件导入类A时也会加载它。但是没有必要,你的类A知道什么类C是有能力的,因为只有B正在使用它。
答案 1 :(得分:2)
你有没有遇到过循环导入,我想你不是。
其他答案也是正确的,但是当涉及循环导入时,编译器会出错,您必须使用@class而不是import。
简单例子
//A.h
#import "B.h"
//B.h
#import "A.h"
在这种情况下,编译器会给你错误。因此,您必须在其中一个头文件中使用@class来删除循环导入。确实,@ class比#import快,但是我的项目没有大量的文件需要几个小时来编译它:)
答案 2 :(得分:1)
好的,试着更清楚一点。这就是你通常想要的:
如果头文件不需要访问您要导入的类中的任何内容,则在@class
文件中使用.h
(即,只需要知道该类存在于为了编译)。
使用#import
文件中的.m
来访问导入的类属性和方法。
例如,您的班级Foo
需要使用您创建的另一个班级Bar
。 Bar
还有一个自定义初始值设定项-initWithCustomValue:
。
<强> MyClass.h 强>
@class Bar
...
Bar _instanceVariable;
<强> MyClass.m 强>
#import "Bar.h"
...
_instanceVariable = [[Bar alloc] initWithCustomValue:1];
这将确保您不会将不必要的代码(即Bar
的内容)暴露给可能导入MyClass.h
的其他类。
来自Apple文档:
@class指令最小化编译器看到的代码量 和链接器,因此是提供前进的最简单方法 声明一个类名。简单,它避免了潜力 导入仍导入其他文件的文件可能带来的问题 文件。例如,如果一个类声明了静态类型的实例 另一个类的变量,以及它们的两个接口文件 另外,这两个类都没有正确编译。