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

use*_*830 18 objective-c ios4

这样做有什么不同吗?

@class MyViewController;
Run Code Online (Sandbox Code Playgroud)

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

#import "MyViewController.h"
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

rjs*_*ing 21

有一个很大的不同.

@class MyViewController;
Run Code Online (Sandbox Code Playgroud)

是对象的前向声明MyViewController.当您只需要告诉编译器有关对象类型但不需要包含头文件时,可以使用它.

但是,如果您需要创建此类型的对象并在其上调用方法,则需要:

#import "MyViewController.h"
Run Code Online (Sandbox Code Playgroud)

但通常这是在.m文件中完成的.

前向声明的另一个用途是@protocol在同一个头文件中定义一个使用它的对象.

@protocol MyProtocolDelegate; //forward declaration

@interface MyObject {
    id<MyProtocolDelegate> delegate;
    ...
}
...
@end

@protocol MyProtocolDelegate
    ... //protocol definition
@end
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,编译器需要知道它在@protocol MyProtocolDelegate编译MyObject对象之前是有效的.

简单地移动上面MyObject定义的协议定义也是有效的.


Hot*_*cks 6

@class 允许您声明符号是Objective-c类名,而无需#import定义类的头文件.

您可以使用此选项,只需要为了声明类的指针或类的方法参数而定义的类名,并且您不需要访问类中的任何方法,字段或属性.

与#import相比,它节省了少量的编译时间,它有时可以帮助避免凌乱的包含循环问题.

[并且,正如rjstelling指出的那样,在有交错声明的情况下,它有时很有用,你需要"转发声明"某些内容.