【问题标题】:Forward declare structs in Objective C在 Objective C 中前向声明结构
【发布时间】:2013-04-02 13:20:15
【问题描述】:

我正在编写一个 iOS 应用程序,其中我有一个模型类,它将使用我提供给它的 XMLElement 进行初始化。

我在 XML 部分使用 TBXML。

模型类的标题如下所示:

@interface CatalogItem : NSManagedObject

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSManagedObject *group;

-(id)initWithXMLElement:(TBXMLElement*)element;

@end

现在不包括定义 TBXMLElement 的标头,我想在类定义之前使用:struct TBXMLElement 转发声明它。但是,我收到“预期类型”错误,告诉我我的声明不起作用。这不是我的想法吗?

据我了解,在头文件中包含头文件是不好的做法。编译器不需要知道TBXMLElement 的内部工作原理,只需知道它在编译时存在或将存在即可。

【问题讨论】:

  • 错误做法和为错误哭泣..两种不同的情况。 #import 并继续前进。 :)
  • @AnoopVaidya 这根本不是坏习惯。事实上,它被用于整个系统框架。见,例如。 CFStringRef.
  • Josh Elias 应该阅读 bbum 的评论。
  • 感谢您的澄清!

标签: ios objective-c tbxml


【解决方案1】:

你确定是struct?不是一堂课吗?那么前向声明将是@class TBXMLElement

如果真的是struct,只需在定义的地方导入标头即可。

【讨论】:

  • 确实是一个结构体。我想导入标头内部标头并没有我最初想的那么糟糕。
【解决方案2】:

结构的前向声明一直都在使用,但仍涉及导入标头。动机是不允许开发人员直接进入结构。 IE。看看CFString。它被实现为结构,但您不能直接接触结构内容。相反,有一个完整的 API 用于操作结构内容。这允许在不破坏二进制兼容性的情况下更改 CFString 的实现细节。

在您的标头中(最好是定义与 TBXMLElement* 关联的任何 API 的标头):

TBXMLElement.h:

typedef const struct TBLXMLElement *TBXMLElementRef;

extern TBXMLElementRef TBLXMLCreateElement();
... etc ...

然后,在包含 TBLXMLElementAPI 实现的实现文件中:

TBXMElement.c(假设它是一个 C 文件):

typedef struct __TBLXMLElement {
    ... struct members here ...
} TBLXMLElement;

TBXMLElementRef TBLXMLCreateElement()
{
     return (TBXMLElementRef)malloc(sizeof(TBLXMLElement));
}
... etc ....

【讨论】:

    猜你喜欢
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多