17

我最近看了一个教程,演讲者说如果你使用它没有区别:

#import "Class.h"

或者:

@class Class;

我不得不说,我的应用程序以一种或另一种方式工作。但是应该有区别吧?所以我想我问你们。

提前致谢!

4

2 回答 2

29

"#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;

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

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

于 2013-10-19T12:27:18.887 回答
5

根据 Apple 文档:

@class 允许你声明一个符号是一个 Objective-c 类名,而不需要 #import 定义类的头文件。

您将在您只需要定义类名以声明指向类的指针或类的方法参数的情况下使用它,并且您不需要访问类中的任何方法、字段或属性。

与#import 相比,它节省了极少的编译时间,并且有时有助于避免混乱的包含循环问题。

从这里得到很好的答案

例如,当您创建协议时:

@class yourCustomView;

@protocol yourCustomViewDelegate <NSObject>

@required

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

@end

@interface yourCustomView : FIView
于 2013-10-19T10:40:03.967 回答