iOS - 核心数据模型与邮件框架冲突?

Posted

技术标签:

【中文标题】iOS - 核心数据模型与邮件框架冲突?【英文标题】:iOS - Core Data model Conflict With Mail Framework? 【发布时间】: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 中的某个类导致了冲突,但我有几个问题:

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

【问题讨论】:

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

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

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

【讨论】:

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

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

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

【讨论】:

以上是关于iOS - 核心数据模型与邮件框架冲突?的主要内容,如果未能解决你的问题,请参考以下文章

如何在核心数据模型iOS中找出特定属性索引的值

如何快速测试框架中使用的核心数据模型

如何将核心数据添加到 iOS 的静态框架?

如何将数据从 iOS 中的数据模型存储到核心数据中并以数据模型的格式获取

使用实体框架核心模型时 WPF 数据网格未更新

核心数据模型 Url 在框架中为 Nil