@class和#import比较

18 浏览
0 Comments

@class和#import比较

我理解在ClassA需要包含ClassB头文件,而ClassB需要包含ClassA头文件时,应该使用前向类声明以避免任何循环包含的问题。我也知道,#importifndef相同,只是确保一次包含。

我的问题是:什么时候使用#import,什么时候使用@class?有时,如果我使用@class声明,我会看到一个常见的编译器警告,如下所示:

warning: receiver \'FooController\' is a forward class and corresponding @interface may not exist.

真的很想理解这个问题,而不仅仅是删除@class前向声明并加入#import以消除编译器给我的警告。

admin 更改状态以发布 2023年5月25日
0
0 Comments

三个简单的法则:

  • 只在头文件(.h文件)中使用#import导入超类和采用的协议。
  • 在实现文件(.m文件)中导入所有你发送消息到的类和协议。
  • 对于其它所有情况,使用前向声明。

如果你在实现文件中使用前向声明,那么可能是做错了什么。

0
0 Comments

如果您看到了以下警告:

warning: receiver 'MyCoolClass' is a forward class and corresponding @interface may not exist

您需要在实现文件(.m)中使用#import导入文件,并在头文件中使用@class声明。

@class通常不会删除需要#import文件的必要性,它只是将要求向下移动更接近信息有用处的地方。

例如

如果您使用@class MyCoolClass,编译器就知道它可能会看到以下内容:

MyCoolClass *myObject;

它不必担心任何除MyCoolClass是一个有效的类并且应该为它保留指针(实际上只是一个指针)以外的事情。因此,在您的头文件中,@class在90%的情况下已经足够了。

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

0