核心数据 - 访问从 fetch EXC_BAD_ACCESS 返回的对象

Posted

技术标签:

【中文标题】核心数据 - 访问从 fetch EXC_BAD_ACCESS 返回的对象【英文标题】:Core Data - accessing objects returned from fetch EXC_BAD_ACCESS 【发布时间】:2010-08-27 07:21:17 【问题描述】:

以下是作为我的一个托管对象实体上的一个类别中的类方法实现的,还有许多其他操作:

+ (NSArray*)newArrayOfAllOtherBibs

  NSManagedObjectContext* moc = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
  NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init];    
  NSString* entityName = NSStringFromClass([self class]);

  NSEntityDescription* entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:moc];
  [fetchRequest setEntity:entity];

  NSError* error;
  NSArray* items = [moc executeFetchRequest:fetchRequest error:&error];
  [fetchRequest release];

  NSMutableArray* bibArray = [NSMutableArray array];

  for(int i = 0; i < [items count]; i++)
  
    Person* person = [items objectAtIndex:i];

    if(![person.isSelf isEqualToString:@"YES"])
    
// crash here!
      if([person.bib length] > 0)
// crash here!
        [bibArray addObject:person.bib];
    
  
  return [bibArray retain];

所以它应该查看 Person 的所有实体,返回一个非常简单的提取,并将所有未标记为“self”(属性 isSelf,类型 NSString)的所有实体添加到返回给调用者的新数组中.添加/删除/查找匹配的所有其他方法都运行良好。

使用

NSString* entityName = NSStringFromClass([self class]);

试图使函数更通用,这样我就可以根据需要为其他实体剪切和粘贴这些函数,而编辑更少。

这个人长这样:

    @interface Person :  NSManagedObject  
    
    

    @property (nonatomic, retain) NSString * bib;
    @property (nonatomic, retain) NSString * isSelf;
[...]    
    @end

问题是,什么可以解释EXC_BAD_ACCESS就行了?分析仪什么也没显示。在这一点上,人显然没问题,否则我希望它在访问.isSelf 时早点死去。 (可以将其设为布尔值,但我发现有两种布尔值,一种 BOOL 和一种 NSNumber,容易出错)。如果 person.bib 是 nil ,那么调用它的长度应该仍然返回 0 对吗?但无论如何它不能为零,因为“围兜”是这些实体的关键,没有它就永远不会被创建。在这个阶段,没有从存储中删除任何内容,它是自上次添加后保存的新存储。

【问题讨论】:

【参考方案1】:

问题原因:

  NSDictionary *resultDict = [responseString JSONValue];
    NSString* bib = [resultDict objectForKey:@"bib"];
      person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:moc];
      person.bib = bib;

[...很多东西为人等建立关系]

  NSError *error;
  if (![moc save:&error]) 
  
    NSLog(@"Core Data Save error %@, %@", error, [error userInfo]);
  

修复:

person.bib = [bib copy];

在保存 Person 实体时,bib 字符串似乎无效。

【讨论】:

【参考方案2】:

最好的办法是在可执行文件中设置NSZombieEnabled 并从那里调试它。这样您就可以看到导致问题的原因。

【讨论】:

这是找到问题所在的一个非常好的方法——但我已经缩小了范围,问题是“怎么会这样”而不是“我为什么会崩溃”?接收到一个主键(标记为非可选)为 nil 的 Core Data 对象是非常令人惊讶的。【参考方案3】:

如果您延迟加载一些变量,请确保在释放它们时将它们设置为 nil,因为如果下次访问它们时没有。它们不会被“跳过”,您的应用程序将尝试使用它们,但由于它们没有指向有效的对象,它会失败并给您类似 EXC_BAD_ACCESS 的错误

【讨论】:

并非如此——我只在进行如图所示的提取后才使用 Person 实体。可以使用 [managedObjectContext deleteObject:person] 删除它们;但从不采用相同的方法。【参考方案4】:

Person.bib 可能尚未加载。

您是否将 bib 属性定义为 @dynamic 而不是 @synthesize?

您是否覆盖了围兜访问器方法?如果是这样,您的覆盖需要对 KVO 友好。

【讨论】:

以上是关于核心数据 - 访问从 fetch EXC_BAD_ACCESS 返回的对象的主要内容,如果未能解决你的问题,请参考以下文章

为啥 PHP 无法从 Js FormData fetch 中获取 $_POST 数据?

核心数据方便获取方法

swift中的核心数据值访问错误

从使用 MySQL _FETCH 设置的字符串中删除双引号的最佳方法是啥?

Firebase Fetch - 无访问控制允许来源

错误:“线程 1:EXC_BAD_ACCESS(代码=EXC_I386_GPFLT)