【问题标题】:Difference between @class and #imports@class 和 #imports 之间的区别
【发布时间】:2012-01-13 10:29:48
【问题描述】:

谁能解释一下使用#import 语句包含一个额外的头文件和使用@class 之间的区别。例如

//MyClass.h

#import <Foundation/foundation.h>
#import "someOtherClass.h"

//MyClass.m

#import"MyClass.h"
@class someOtherClass

implementation

当我尝试使用第二种方法时,它并不总是有效。

如果相同的概念适用于相同场景的 C++,我现在也想知道

谢谢

【问题讨论】:

  • 我刚刚意识到我在@class 的原始语法中犯了一个错误。感谢您修复它

标签: c++ objective-c cocoa


【解决方案1】:

Objective C 和 C++ for C++ 的答案不同,请参见链接

#import 是 Microsoft 特有的,我强烈反对使用它。

而 #include 符合标准并被所有主要编译器实现使用,坚持这一点。

重复:C++ include and import difference 更好地比较两者。

【讨论】:

  • #import 也用于 Objective-c 并且是标准。你应该在那里使用它!
  • #import 不是 MS特有的。
  • 如果你不了解Objective-C,那就别回答了!或者至少,在回答之前先搜索一下!
  • #import 不是 MS 特定的。它用于 Objective-c、Java(import) 和可能的其他语言
  • @Macmade:一半的问题是关于 C++ 的,其他答案都没有解决。
【解决方案2】:

@class 被称为forward declaration,表示您想使用该类型,但没有任何接口详细信息(即您不知道它的方法和属性)。

#import 是一个预处理语句(与#include 非常相似),在编译时它会替换为您正在导入的文件的内容,并且您可以访问类型及其接口(即,您将知道它的方法和属性)。

两者之间的区别在于您希望将多少信息传递给正在使用您的类的代码。

示例:

在 .h 文件中声明私有 ivars 时使用 @class。将它与 .m 中的 #import 语句配对。这将加快编译速度,并有助于提高代码的可读性。

当需要类型接口的详细信息来使用您的类时,请在 .h 文件中使用 #import。这就是为什么您必须#import 原型的原因,因为您需要了解接口详细信息,以便编译器知道您是否正在实现所需的方法。

您还想#import 超类,因为polymorphism 需要它的接口详细信息。

【讨论】:

  • +1 我正要添加相同的答案。我要补充一点,在 Objective-C 中编写 @class X; 与在 C++ 中编写 class X; 相同。
  • 我也查看了附加链接。那么,我是否理解您从未真正单独使用 @class 声明?您只需将其放在头文件中以转发声明一个类,将#import 语句添加到 .m 文件中,或者,您是否可以并且应该只使用 @class 声明?
  • @class 声明几乎总是与 .m 文件中的 #import 相结合。请参阅 Parag 的答案。前向声明的目的是加速编译并保持头文件“精简”。 Parag 的回答更多地解释了这个概念。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 2018-11-02
  • 2016-04-13
  • 2011-06-09
  • 2016-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多