目标C中的前向声明结构

时间:2013-04-10 15:34:24

标签: ios objective-c tbxml

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

我正在使用TBXML作为XML部分。

模型类的标题如下所示:

@interface CatalogItem : NSManagedObject

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

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

@end

现在我不想包含定义TBXMLElement的头文件,而是想在类定义之前使用:struct TBXMLElement转发声明它。然而,我收到一个“预期类型”错误,告诉我我的声明无效。这不是我对此的看法吗?

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

2 个答案:

答案 0 :(得分:4)

结构的前向声明一直在使用,但仍然涉及导入标题。动机是不允许开发人员直接进入结构。即看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 ....

答案 1 :(得分:0)

你确定它是struct吗?不是课吗?然后前向声明将是@class TBXMLElement

如果它真的是struct,只需导入定义它的标题。