@class在iOS 4开发中做了什么?

时间:2011-07-29 11:04:29

标签: objective-c ios4

做什么有什么不同

@class MyViewController;

而不是将.h正常导入appdelegate.h

#import "MyViewController.h"

我最近看到一些使用@class方式的例子,并想知道是否有任何差异。

感谢。

2 个答案:

答案 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指出的那样,它有时在你有交错声明的地方很有用,你需要“转发声明”某些东西。]