2

我的 MoGen 命令行(构建阶段)是

mogenerator -m PT1/Data/DataModel.xcdatamodeld -O PT1/Data -–template-var arc=true

这应该适用于ARC。但是在机器类中我得到类似的东西

extern const struct ClientInfoAttributes {
    NSString *accountNumber;
    ...
} ClientInfoAttributes;

这给出了错误“ARC 禁止 struct 中的 Objective-C 对象”。大概我在这里犯了某种错误。谁能指出我的问题?

我正在使用 iOS7 和 XCode 5 测试版,但这似乎与此无关。虽然它可能是相关的。

-鲍勃

4

2 回答 2

5

我正在使用正确的选项来 mogenerator for ARC。正如您在我原来的问题中看到的那样,它是 --template-var arc=true 。但是,我从这个博客条目 raptureinvenice.com/getting-started-with-mogenerator 复制了命令行。在此条目中,interwebs 软件已将作者的“--”更改为长破折号或 m-破折号。当我复制和粘贴时,我得到了一个看起来正确但不正确的破折号。mogen 软件当前不会将此标记为错误。它只是默默地忽略它。

当我最终重新输入 -- 从头开始​​时,它工作正常。Mogen 使用 __unsafe_unretained 来防止编译器错误。

博客作者已经修复了博客条目,我已经向 mogen 项目提出了一个问题,以便将来报告此类错误。

于 2013-08-23T03:20:56.167 回答
0

我怀疑顺序很重要。采用

mogenerator --template-var arc=true -m PT1/Data/DataModel.xcdatamodeld -O PT1/Data


关于错误,不言自明

ARC 禁止 struct 中的 Objective-C 对象

clang文档中所述

4.3.5 结构体和联合体的所有权限定字段

如果程序将 C 结构或联合的成员声明为具有非平凡的所有权限定类型,则该程序是格式错误的。

基本原理

生成的类型在 C++ 意义上是非 POD,但 C 并没有为我们提供非常好的语言工具来管理聚合的生命周期,因此简单地禁止它们更方便。仍然可以使用一个void*或一个__unsafe_unretained对象来管理它。

因此,正如文档所建议的那样,快速而肮脏的解决方案是将对象声明为__unsafe_unretained. 就像是:

extern const struct ClientInfoAttributes {
    __unsafe_unretained NSString *accountNumber;
    ...
} ClientInfoAttributes;

无论如何要小心,因为从现在开始,您必须处理此类对象的内存管理。

于 2013-08-23T00:10:07.633 回答