为什么MoGenerator会与ARC发生冲突?

时间:2013-08-22 00:10:30

标签: ios objective-c automatic-ref-counting mogenerator

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测试版,但这似乎与此无关。但它可能是相关的。

-Bob

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:0)

我怀疑订单很重要。使用

  

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


关于错误,它是不言自明的

  

ARC禁止struct

中的Objective-C对象

正如clang documentation

中所述
  

4.3.5结构和工会的所有权合格领域

     

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

     

原理

     

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

因此,正如文档所示,快速而肮脏的解决方案是将对象声明为__unsafe_unretained。类似的东西:

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

无论如何要注意从现在起你必须为这样的对象处理内存管理。