0

我正在使用 Cocos2d 2.x 和 iOS 5.0。

谁能与我分享一个关于“@class Component”标签用法的好教程或解释?

是否有任何引用它的设计/模式,或者它是否对代码做了更具体的事情?

我在谷歌搜索上没有找到太多东西。

4

2 回答 2

3

@class只是告诉编译器后面的名字是一个Objective-C类的名字。当需要定义该类型的符号但导入整个定义会过度杀伤或导致实际问题时,它会在 .h 文件中使用。(例如,两个类相互引用。)

于 2013-01-05T14:34:39.147 回答
1

它的工作方式是,通常如果您在接口中引用一个类,您必须 #import 该类的头文件:

#import "OtherClass.h"

@interface MyClass : NSObject
{
   OtherClass* someOtherClass;
}
@end

@class 语句允许您跳过导入标头:

@class OtherClass;

@interface MyClass : NSObject
{
   OtherClass* someOtherClass;
}
@end

如果你使用@class,你仍然必须在实现文件中#import "OtherClass.h"。

// Still need to import, but now any class importing MyClass.h 
// does not automatically know about OtherClass as well.

#import "OtherClass.h"

@implementation MyClass
…
@end

当您在第三类的其他位置#import "MyClass.h" 时,如果您使用了@class OtherClass,则该第三类不会自动包含OtherClass 类的标题;在 MyClass 标题中。因此,除非明确导入 OtherClass.h 标头,否则第三类不知道 OtherClass。这在编写一个应该对开发人员隐藏其实现细节(即OtherClass)的公共API 时很有帮助。

前向声明被认为是一种很好的做法(如果只是因为它除了稍微改变了工作流程之外没有其他缺点)并且比在另一个头文件中导入类的头文件更可取。这无疑有助于防止 Phillip 提到的循环进口。

我不了解 Xcode,但在 Visual Studio (C++) 中,类转发也有助于加快具有数百个类的大型项目的编译速度。那是因为 VS C++ 编译器花费了相当长的时间来解决头文件依赖

于 2013-01-05T15:38:12.240 回答