#import和@class之间的区别

Gus*_*007 17 import xcode class ios

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

#import "Class.h"
Run Code Online (Sandbox Code Playgroud)

要么:

@class Class;
Run Code Online (Sandbox Code Playgroud)

我不得不说,我的应用程序以这种或那种方式工作.但是必须有区别吗?以为我问你们.

提前致谢!

Vin*_*ngh 28

"#import"将整个头文件带入当前文件; 任何包含#imports文件的文件也包括在内.

另一方面,@ class(当在一行上使用某些类名时),只是告诉编译器"嘿,你很快就会看到一个新的令牌;它是一个类,所以这样对待它".

当你有" 循环包含 " 的潜力时,这非常有用; 即,Object1.h引用Object2,Object2.h引用Object1.如果你把#import both文件放到另一个文件中,那么编译器在尝试#importObject1.h时会感到困惑,查看它并看到Object2.h; 它尝试#importObject2.h,并看到Object1.h等.

另一方面,如果每个文件都有@classObject1; 或@classObject2;,然后没有循环引用.只需确保实际#import(.m)文件中包含所需的标头.

例如

如果你说@class myClass,编译器知道它可能会看到类似的东西:

myClass *myObject;
Run Code Online (Sandbox Code Playgroud)

除了myClass是一个有效的类之外,它不必担心任何事情,它应该为指向它的指针保留空间(实际上,只是一个指针).因此,在标题中,@class90%的时间都足够了.

但是,如果您需要创建或访问myObject的成员,则需要让编译器知道这些方法是什么.此时(可能在您的实现文件中),您需要#import "myClass.h"告诉编译器除了"这是一个类"之外的其他信息.


inc*_*iko 5

根据Apple文档:

@class允许您声明符号是Objective-c类名,而无需#import定义类的头文件.

您可以使用此选项,只需要为了声明类的指针或类的方法参数而定义的类名,并且您不需要访问类中的任何方法,字段或属性.

与#import相比,它节省了少量的编译时间,它有时可以帮助避免凌乱的包含循环问题.

这里回答很好

例如,当您创建协议时:

@class yourCustomView;

@protocol yourCustomViewDelegate <NSObject>

@required

- (void) somethingDidInView:(UIView*)view;

@end

@interface yourCustomView : FIView
Run Code Online (Sandbox Code Playgroud)