将__NSCFString发送到NSEntityDescription的entityForName:inManagedObjectContext:返回nil

时间:2014-07-29 17:06:18

标签: ios objective-c core-data nsstring

在Xcode 5中:(我正在使用5.1.1)

  1. 创建一个新的iPhone项目,选择启用了核心数据的 Master-Detail Application 模板。
  2. xcdatamodeld 文件中,您应该看到已创建默认实体:事件。创建一个新实体并将其命名为Delta。 (注意:这些名称很重要,您很快就会看到。)
  3. MasterViewController.m fetchedResultsController方法中:
  4. 改变这个:

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:self.managedObjectContext];
    

    对此:

    NSString *entityName = [@"E" stringByAppendingString:@"vent"];
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:self.managedObjectContext];
    

    现在在 iPhone Retina(4英寸64位)模拟器上运行应用程序。

    您将收到以下错误消息:

      

    ***因未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'executeFetchRequest:error:获取请求必须有实体。'

    原因是因为entityForName:inManagedObjectContext:正在返回nil。

    知道为什么会这样吗?

    解决方法1:不要使用__NSCFString

    如果在entityName设置后立即在行上放置断点,您将看到其值和类型为:

      

    entityName __ NSCFString * @“事件”

    如果更改将entityName分配给的行:

    NSString *entityName = @"Event";
    

    然后它的类型变为:

      

    entityName __ NSCFConstantString * @“事件”

    现在将正确填充entity,应用程序不会崩溃。

    解决方法2:将事件设置为xcdatamodel

    中最顶层的对象

    Delta重命名为Foxtrot并运行原始代码。变量entityName仍为__NSCFString,但此次entityForName:inManagedObjectContext:将返回有效值。

    解决方法3:使用32位设备

    如果将模拟器更改为32位设备,原始代码将正常工作。

0 个答案:

没有答案