做什么有什么不同
@class MyViewController;
而不是将.h正常导入appdelegate.h
#import "MyViewController.h"
我最近看到一些使用@class方式的例子,并想知道是否有任何差异。
感谢。
答案 0 :(得分:21)
有很大的不同。
@class MyViewController;
是对象MyViewController
的前向声明。当您只需要告诉编译器有关对象类型但不需要包含头文件时,就会使用它。
但是,如果您需要创建此类型的对象并在其上调用方法,则需要:
#import "MyViewController.h"
但通常这是在.m
文件中完成的。
前向声明的另一个用途是在同一个头文件中定义@protocol
作为使用它的对象。
@protocol MyProtocolDelegate; //forward declaration
@interface MyObject {
id<MyProtocolDelegate> delegate;
...
}
...
@end
@protocol MyProtocolDelegate
... //protocol definition
@end
在上面的例子中,编译器需要知道@protocol MyProtocolDelegate
在编译MyObject
对象之前是有效的。
简单地将协议定义移到MyObject
定义之上也是有效的。
答案 1 :(得分:6)
@class
允许您声明符号是Objective-c类名,而无需#import定义类的头文件。
您将使用此选项,只需要为声明指向类的类或类的方法参数而定义的类名,并且您不需要访问类中的任何方法,字段或属性
与#import相比,它节省了少量的编译时间,它有时可以帮助避免凌乱的包含循环问题。
[并且,正如rjstelling指出的那样,它有时在你有交错声明的地方很有用,你需要“转发声明”某些东西。]