【问题标题】:iOS - Core Data model Conflict With Mail Framework?iOS - 核心数据模型与邮件框架冲突?
【发布时间】:2012-09-25 02:54:28
【问题描述】:

我有一个核心数据对象Account,表示为NSManagedObject 的子类:

@interface Account : NSManagedObject

我的整个应用程序一直开发得很好,但是,当我添加 MessageUI.framework 以便我可以获得一个撰写电子邮件视图控制器时,一切都崩溃了。该应用程序可以正常链接和编译,并且运行良好。直到,也就是说,我开始与我以前工作的 Account 对象进行交互。然后,我开始得到这些:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: '"Account" is not a subclass of NSManagedObject.'
*** First throw call stack:
(0x202b012 ... 0x2385)
libc++abi.dylib: terminate called throwing an exception

其中一个特殊的原因是:

// we need to insert a new account
Account *newAccount = [NSEntityDescription
                            insertNewObjectForEntityForName:[Account entityName] 
                            inManagedObjectContext:self.managedObjectContext];

现在,我猜测MessageUI.framework 中的某个类导致了冲突,但我有几个问题:

  1. 应用编译和运行正常,没有编译时名称冲突
  2. 框架中的其他组件似乎是前缀命名空间(即:MFMailComposeViewController),那么理论上的帐户应该不是MFAccount
  3. 我什至没有做#import <MessageUI/MessageUI.h> 或更紧的#import <MessageUI/MFMailComposeViewController.h>,我检查了后者并没有看到Account 的定义,所以我不确定为什么甚至会加载可能的冲突.
  4. 为了确定,我重新生成了我的 Core Data 类,并重置了所有模拟器设置,仍然没有骰子。
  5. 从项目中删除框架并构建设置可立即解决此问题。

【问题讨论】:

  • 你试过重命名你的 NSManagedObject 子类吗?
  • @geraldWilliam:虽然我认为这将解决这种情况,但如果没有必要,我宁愿不命名我的模型。我真的问这个问题是因为我想知道我错过了什么,因为我所有的调查都导致了死胡同,如果这种情况或类似情况再次出现,我希望能够解决它快速且凭直觉。
  • 当然有道理。只是当我遇到类似的情况时,我将托管对象子类命名为“消息”,我只是将其重命名,问题就解决了。展望未来,我只是用前缀命名我的所有托管对象子类以避免这个问题。
  • @Josh 是否为您的模型对象名称添加前缀解决了这个问题?
  • @CarlVeazey:经过一些进一步的徒劳研究,我确实最终给它们加上了前缀。谢谢!

标签: objective-c ios xcode nsmanagedobject messageui


【解决方案1】:

我遇到过这种情况,这是精确的框架(该类称为Broadcaster)。在这种情况下,私有的Message 框架通过MessageUI 链接,并且该框架提供了Account 的实现。

您可以通过新建项目来验证 MessageUI 框架是否加载了 Account 类,并在应用委托的 application:didFinishLaunchingWithOptions: 方法中添加以下代码:

NSString *account = @"Account";
Class accountClass = NSClassFromString(account);
NSLog(@"accountClass = %@",accountClass);

在新项目中,这将打印 accountClass = (null),但在添加 MessageUI 后,它将打印 accountClass = Account

此外,如果您在私有Message 框架上使用class-dump,您将看到Account 的接口声明。

现在,您在帖子中列出了 5 个问题作为问题,我将尝试解决它们

  1. 我对使用的链接时间过程了解得不够多 可以肯定地说是框架,但我怀疑 Message 框架链接较弱,因此不会在链接时导致重复符号错误。
  2. 面向公众的名称正确,但有些未记录 那些不是。此外,冲突类位于私有 Message 框架中。
  3. 这根本不重要。编译器将使用#import,但在 运行时,所有类都与您的应用程序一起加载,并在那里 在运行时没有“可见性”或类似的东西。
  4. 不适用
  5. 与其他证据一致

就行动方案而言,我只是将我的模型类重命名为具有前缀。我不知道有任何其他解决方案。

【讨论】:

  • 是的,重命名“帐户”实体可以解决问题。
  • 您也可以将“OutgoingMessage”添加到禁止列表中,至少在 ios6 上是这样。哎哟。
【解决方案2】:

消息框架可能根本不是问题。像这样的事情可能会在核心数据中意外发生,例如当您以某种方式更改模型时。尝试清理构建,删除您的模拟器/硬件安装的测试应用程序,然后再次运行。我认为 geraldWilliam 建议重命名它的原因是为了解决这个问题,但可能没有必要重命名任何东西

看看这个帖子:Could not locate NSManagedObjectModel for Entity

【讨论】:

    猜你喜欢
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多