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

Jos*_*osh 8 xcode objective-c messageui nsmanagedobject ios

我有一个Core Data对象Account,表示为以下的子类NSManagedObject:

@interface Account : NSManagedObject
Run Code Online (Sandbox Code Playgroud)

我的整个应用程序一直在发展很好,但是,当我添加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
Run Code Online (Sandbox Code Playgroud)

其中一个特殊原因是:

// we need to insert a new account
Account *newAccount = [NSEntityDescription
                            insertNewObjectForEntityForName:[Account entityName] 
                            inManagedObjectContext:self.managedObjectContext];
Run Code Online (Sandbox Code Playgroud)

现在,我猜测MessageUI.framework导致冲突有一些课,但我有几个问题:

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

Car*_*zey 8

我发生过这种情况,这是确切的框架(该类被称为Broadcaster).在这种情况下,私有Message框架通过链接MessageUI,并且此框架提供了Account实现.

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

NSString *account = @"Account";
Class accountClass = NSClassFromString(account);
NSLog(@"accountClass = %@",accountClass);
Run Code Online (Sandbox Code Playgroud)

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

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

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

  1. 我不太了解使用Frameworks的链接时进程肯定地说,但我怀疑Message框架是弱链接的,因此在链接时不会导致重复的符号错误.
  2. 面向公众的人被正确命名,但一些没有证件的人则没有.此外,冲突的类位于私有Message框架中.
  3. 这根本不重要.编译器将使用#import,但在运行时,所有类都与您的应用程序一起加载,并且没有"可见性"或类似于运行时强制执行的任何类.
  4. N/A
  5. 与其他证据一致

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