在头文件中导入目标C的混淆

时间:2011-11-03 09:50:19

标签: iphone objective-c

我是iphone开发的新手,我有点问题。 我的问题是我们什么时候在.h(header)文件中使用@class和#import。如果你的答案是@class你可以创建实例但不能..使用它的方法并在.h文件中使用#import我们可以访问第二类的所有方法和变量。然后我的问题是 如果#import包含优势,那么为什么很多人只在他们的.h文件中使用@class。

请有人回答然后尽快回复。谢谢。

3 个答案:

答案 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)

好的,试着更清楚一点。这就是你通常想要的:

  1. 如果头文件不需要访问您要导入的类中的任何内容,则在@class文件中使用.h(即,只需要知道该类存在于为了编译)。

  2. 使用#import文件中的.m来访问导入的类属性和方法。

  3. 例如,您的班级Foo需要使用您创建的另一个班级BarBar还有一个自定义初始值设定项-initWithCustomValue:

    <强> MyClass.h

    @class Bar
    
    ...
    
    Bar _instanceVariable;
    

    <强> MyClass.m

    #import "Bar.h"
    
    ...
    
    _instanceVariable = [[Bar alloc] initWithCustomValue:1];
    

    这将确保您不会将不必要的代码(即Bar的内容)暴露给可能导入MyClass.h的其他类。

    来自Apple文档:

      

    @class指令最小化编译器看到的代码量   和链接器,因此是提供前进的最简单方法   声明一个类名。简单,它避免了潜力   导入仍导入其他文件的文件可能带来的问题   文件。例如,如果一个类声明了静态类型的实例   另一个类的变量,以及它们的两个接口文件   另外,这两个类都没有正确编译。