iOS - 核心数据模型与Mail Framework冲突?

时间:2012-09-25 02:54:29

标签: objective-c ios xcode nsmanagedobject messageui

我有一个核心数据对象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. 为了确定,我重新生成了我的核心数据类,并重置了所有模拟器设置,仍然没有骰子。
  5. 从项目中删除框架并立即构建设置可以解决问题。

2 个答案:

答案 0 :(得分:8)

我遇到过这种情况,这是一个确切的框架(该类被称为Broadcaster)。在这种情况下,私有Message框架由MessageUI链接,此框架提供Account实现。

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

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

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

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

现在,您在帖子中列出了5个项目作为问题,我将尝试解决这些问题

  1. 我对使用链接时的过程了解不够 框架要肯定,但我怀疑Message框架是弱链接的,因此在链接时不会导致重复的符号错误。
  2. 面向公众的人被正确命名但有些没有证件 不是。此外,冲突的类位于私有Message框架中。
  3. 这根本不重要。编译器将使用#import,但是在 运行时,所有类都加载了您的应用程序和那里 没有“可见性”或类似于运行时强制执行的任何内容。
  4. N / A
  5. 与其他证据一致
  6. 就行动方案而言,我只是将我的模型类重命名为具有前缀。我不知道任何其他解决方案。

答案 1 :(得分:0)

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

查看此主题:Could not locate NSManagedObjectModel for Entity