这样做有什么不同吗?
@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定义的协议定义也是有效的.
@class 允许您声明符号是Objective-c类名,而无需#import定义类的头文件.
您可以使用此选项,只需要为了声明类的指针或类的方法参数而定义的类名,并且您不需要访问类中的任何方法,字段或属性.
与#import相比,它节省了少量的编译时间,它有时可以帮助避免凌乱的包含循环问题.
[并且,正如rjstelling指出的那样,在有交错声明的情况下,它有时很有用,你需要"转发声明"某些内容.
| 归档时间: |
|
| 查看次数: |
7442 次 |
| 最近记录: |