@class RootViewController;
//#import "RootViewController.h"
当我使用以下代码编译时,出现错误:
//@class RootViewController;
#import "RootViewController.h"
"错误:在 'RootViewController' 之前需要指定限定符列表"
我不明白这两者之间的区别,因为我在一个类中使用了 #import ,并且它编译时没有出现错误!
@class RootViewController;
//#import "RootViewController.h"
//@class RootViewController;
#import "RootViewController.h"
"错误:在 'RootViewController' 之前需要指定限定符列表"
我不明白这两者之间的区别,因为我在一个类中使用了 #import ,并且它编译时没有出现错误!
@class
用于在特定文件中需要知道类的名称,但不需要知道关于这个类的任何详细信息(例如其方法)。#import
用于实际需要使用该类(即发送消息)的情况。
例如,如果您在头文件中声明实例变量,可以使用@class
来声明某种类型的实例变量:
@class MyOtherClass;
@interface MyClass : NSObject
{
MyOtherClass *myIvar;
}
@end
因为你还没有使用myIvar
,所以除了需要知道类型MyOtherClass
存在外,你不需要知道关于它的任何信息。
但是:
#import "MyOtherClass.h"
- (void)doSomething
{
[myIvar doSomethingElse];
}
在这种情况下,您正在将 doSomethingElse
消息发送给 myIvar
;编译器需要知道 MyOtherClass
的实例定义了此方法,因此您必须导入头文件,否则编译器会抱怨。#import
到文件B中时,文件B就变成了对文件A的依赖 - 也就是说,如果文件A发生更改,您必须重新编译文件B。如果您在文件B中使用@class
,则文件B不依赖于文件A,因此当文件A更改时无需重新编译文件B - 因此,如果您仅声明类型而不实际依赖于文件A的实现,则可以通过不#import
文件A来节省编译时间。@class
,在实现文件中使用#import
。(但是,您需要#import
类的超类。在其他一些情况下,您还需要在头文件中使用#import
。)
#import
与#include
不等效。如果一个文件被#include
多次,它将每次都被加载,但是对于同一文件的多个#import
,它仍然只会被加载一次。@class
的主要原因不是为了避免循环依赖,而是为了加快编译速度。@class
的示例。//MYControl.h
@class MYControl; // Must use class
@protocol MYControlDelegate
-(void)control:(MYControl *)control didChangeToState:(UIControlState)state;
@end
@interface MYControl : UIControl
{
id<MYControlDelegate> delegate_;
}
@property (nonatomic, assign) id<MYControlDelegate> delegate;
@end
//MYControl.m
@implementation MYControl
@synthesize delegate = delegate_;
. . .
@class
所做的就是让编译器知道有一个名为 MYControl
的类,并且在某些时候它将被定义。(但是不是在运行时,该类将在编译过程中定义。)MyControl
类依赖于 MyControlDelegate
协议,而 MyControlDelegate
又依赖于 MyControl
。 - JeremyPid<MyControlDelegate> delegate_;
- JeremyP@class
的最大原因。 - mipadi@class
用于避免循环依赖......这可以防止循环引用,其中一个头文件A导入了第二个头文件B,该文件B又导入了第一个头文件A,然后再无限循环下去......@class
通常用于要求编译器在运行时查找其定义......特别是当它驻留在某个静态库中时。
除此之外,#import
也可以正常工作。
@class:它定义了您可以创建导入类的实例变量并在您的类中使用它。
您可以使用给定的链接获取更多信息。
@class是一个前向声明,一个好的实践是将它们放在.h文件中而不是使用#import,以避免循环导入问题。
你必须在想要导入的类中导入这个类。这就是为什么你会得到错误,但可以通过@class example进行矫正。
@class
表示类 RootViewController 的定义尚未声明,但将在运行时定义。我认为它类似于在 C++ 中声明外部类。
#import
相当于 #include。
通过错误信息,我可以猜测你在 RootViewController.h 中犯了一个错误,比如忘记了 ; 或者类似的东西。