#import和@class之间的区别

时间:2013-10-19 10:33:12

标签: ios xcode class import

我最近观看了一个教程,其中说话者说如果你使用它没有任何区别:

#import "Class.h"

或:

@class Class;

我不得不说,我的应用程序可以通过这种方式运行。 但是必须有区别吗?以为我问你们。

提前致谢!

2 个答案:

答案 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