为啥在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
导入 MyExampleClass
和 MyExampleClass
导入 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 中,为啥在分配给指定类型的变量时需要强制转换?