1

我正在编写一个 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,只需知道它存在或将在编译时存在。

4

2 回答 2

4

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

在您的标头中(理想情况下,标头定义了与之关联的任何 API TBXMLElement*):

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 ....
于 2013-04-10T15:43:40.013 回答
0

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

如果它真的是 a struct,只需导入定义它的标头即可。

于 2013-04-10T15:37:44.320 回答