代码之家  ›  专栏  ›  技术社区  ›  Adam Eberbach Adil Shaikh

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

  •  0
  • Adam Eberbach Adil Shaikh  · 技术社区  · 14 年前

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

    + (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”(属性is 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 . (可以将其设置为布尔值,但我发现有两种布尔值,一种布尔值,一种nsnumber,容易出错)。如果person.bib为零,那么调用长度应该仍然返回0对吗?但无论如何,它也不能为零,因为“bib”是这些实体的关键,没有它,就永远不会创造出一个实体。在这个阶段,没有从存储中删除任何内容,这是自上次添加以来保存的新存储。

    4 回复  |  直到 14 年前
        1
  •  2
  •   Adam Eberbach Adil Shaikh    14 年前

    问题原因:

      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];
    

    似乎是 bib 保存人员实体时字符串无效。

        2
  •  0
  •   Liam    14 年前

    最好的办法是 NSZombieEnabled 在可执行文件中进行调试。这样,您就可以看到问题的起因。

        3
  •  0
  •   nacho4d    14 年前

    如果您正在加载一些var,请确保在释放它们时将它们设置为nil,因为如果下次访问它们时不设置为nil。它们不会被“跳过”,您的应用程序将尝试使用它们,但由于它们没有指向有效的对象,所以它会失败,并给您提供错误,如exc-bad-access

        4
  •  0
  •   Graham Perks    14 年前

    person.bib可能尚未加载。

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

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