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

时间:2010-08-27 07:21:17

标签: iphone cocoa-touch core-data

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

+ (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”(属性为Self,类型为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对吗?但它无论如何都不能为零,因为“围兜”是这些实体的关键,没有它就永远不会创造。在这个阶段,没有任何东西从商店中删除,这是一个自上次添加以来已经保存的新店。

4 个答案:

答案 0 :(得分:2)

问题的原因:

  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字符串无效。

答案 1 :(得分:0)

最好的办法是在可执行文件中设置NSZombieEnabled并从那里进行调试。通过这种方式,您将能够看到导致问题的原因。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

Person.bib可能尚未加载。

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

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