【发布时间】:2012-05-30 03:17:25
【问题描述】:
我想知道为什么要使用@class。我有一个一般的理解,它允许你访问你调用的那个类中的东西,但是我不知道它的好处..
【问题讨论】:
标签: iphone ios compiler-directives
我想知道为什么要使用@class。我有一个一般的理解,它允许你访问你调用的那个类中的东西,但是我不知道它的好处..
【问题讨论】:
标签: iphone ios compiler-directives
@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 可以让编译器知道该类存在而不需要导入它。
@class 指令的存在是为了避免创建循环依赖。
例如,如果 A 类需要访问 B 类,而 B 类需要访问 A 类,那么您需要将 A 类导入 B,将 B 导入 A。
链接器将从 A 类转到 B 类,然后从 B 转到具有该引用的 A,并且会无限期地这样做。
相反,通过不导入类,您可以避免这个问题。
【讨论】: