我最近观看了一个教程,其中说话者说如果你使用它没有任何区别:
#import "Class.h"
或:
@class Class;
我不得不说,我的应用程序可以通过这种方式运行。 但是必须有区别吗?以为我问你们。
提前致谢!
答案 0 :(得分:28)
" #import" 将有问题的整个头文件带入当前文件;还包括那些文件 #imports 的文件。
另一方面,@class (当在一行上使用某些类名时),只是告诉编译器"嘿,你会看到一个新标记很快;它是一个类,所以这样对待它。)
当您有潜力循环包含'时,这非常有用。即,Object1.h引用Object2,Object2.h引用Object1。如果你将#import both
文件放到另一个文件中,那么编译器在尝试#import
Object1.h时会感到困惑,查看它并看到Object2.h;它尝试#import
Object2.h,并看到Object1.h等。
另一方面,如果每个文件都有@class
Object1;或@class
对象2;然后没有循环引用。确保在您的实现(.m)文件中实际#import
所需的标头。
例如
如果你说@class myClass
,编译器就会知道它可能会看到:
myClass *myObject;
除了myClass是一个有效的类之外,它不必担心任何事情,它应该为指向它的指针保留空间(实际上,只是一个指针)。因此,在标题中,@class
在90%的时间内都足够了。
但是,如果您需要创建或访问myObject的成员,您需要让编译器知道这些方法是什么。此时(可能在您的实现文件中),您需要#import "myClass.h"
,告诉编译器除了&#34之外的其他信息;这是一个类"。
答案 1 :(得分:5)
根据Apple文档:
@class允许您声明符号是Objective-c类 名称无需#import定义的头文件 类。
如果您只需要为其定义的类名,您可以使用它 声明指向类或方法参数的指针的目的 该类,您不需要访问任何方法,字段或 班上的属性。
与#import相比,它节省了少量的编译时间 有时候有助于避免凌乱包括循环问题。
来自here
的精彩回答例如,当您创建协议时:
@class yourCustomView;
@protocol yourCustomViewDelegate <NSObject>
@required
- (void) somethingDidInView:(UIView*)view;
@end
@interface yourCustomView : FIView