为啥在objective-c中使用@class [重复]

Posted

技术标签:

【中文标题】为啥在objective-c中使用@class [重复]【英文标题】: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。我有一个一般的理解,它允许你访问你调用的那个类中的东西,但是我不知道它的好处..

【问题讨论】:

【参考方案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,并且会无限期地这样做。

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

【讨论】:

以上是关于为啥在objective-c中使用@class [重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Objective-C 中的头文件顶部有 import 和 class 语句?

在 Objective-C 中,为啥在分配给指定类型的变量时需要强制转换?

Objective-C @class

objective-c中#import和@class的差别

Objective-c:为啥在使用 KVC 时私有 ivars 不被外部访问隐藏

为啥 Objective-C 不显示 OpenCV 捕获的视频的输出帧?