【问题标题】:why is @class used in objective-c [duplicate]为什么在objective-c中使用@class [重复]
【发布时间】:2012-05-30 03:17:25
【问题描述】:

可能重复:
@class May I know the proper use of this

我想知道为什么要使用@class。我有一个一般的理解,它允许你访问你调用的那个类中的东西,但是我不知道它的好处..

【问题讨论】:

    标签: iphone ios compiler-directives


    【解决方案1】:

    @class 指令设置对另一个类的前向引用。它告诉编译器该命名类存在,因此当编译器到达 @property 指令行时,不需要额外的信息,它假定一切正常并继续前进。

    例如,这段代码自己就可以正常工作:

    #import <UIKit/UIKit.h>
    #import "MyExampleClass"
    
    @interface CFExampleClass : NSObject <SomeDelegate> {
    }
    
    @property (nonatomic, strong) MyExampleClass *example;
    
    @end
    

    但是,假设我们想要避免循环包含这些头文件(例如 CFExampleClass 导入 MyExampleClassMyExampleClass 导入 CFExampleClass),那么我们可以使用 @class 告诉编译器 MyExampleClass 存在任何投诉。

    #import <UIKit/UIKit.h>
    @class MyExampleClass;
    
    @interface CFExampleClass : NSObject <SomeDelegate> {
    }
    
    @property (nonatomic, strong) MyExampleClass *example;
    
    @end
    

    【讨论】:

    • 它还消除了任何循环引用的机会。如果你在MyClassB 中有对MyClassA 的引用,反之亦然,你会得到一个错误。使用@class 可以让编译器知道该类存在而不需要导入它。
    • 是的,完全正确。我刚刚编辑了它。谢谢。
    • 啊啊啊啊啊啊啊..太酷了!我可能应该回顾一下我的代码并更改我的一些#imports 哈哈:P(我很快就会接受你的回答)
    • 实际上,除非您有循环引用,否则这并不是必需的。编译器是否没有抱怨取决于您,当然也不需要。
    【解决方案2】:

    @class 指令的存在是为了避免创建循环依赖。

    例如,如果 A 类需要访问 B 类,而 B 类需要访问 A 类,那么您需要将 A 类导入 B,将 B 导入 A。
    链接器将从 A 类转到 B 类,然后从 B 转到具有该引用的 A,并且会无限期地这样做。

    相反,通过不导入类,您可以避免这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      • 2015-09-03
      • 2021-09-12
      • 2013-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多