核心数据:在访问关系中的对象时的“EXC_BAD_ACCESS”

时间:2011-07-04 14:10:31

标签: ios core-data nsmanagedobject

我有一对多的名称匹配和局的映射关系。

match <-->> innings
  • match包含字段名称,ID等。
  • innings包含字段编号。

我可以获得match个属性。我在MatchList的{​​{1}}中创建了一个新匹配。我看到表格中提供了TableListControllerMatch的数据。现在,我单击表中创建的行。

但是当我innings时,我得到[match matchinnings],。我能够从inningSet获得两个对象inningA和inningB。当我尝试拨打NSSet* inningSet时,我收到错误。

下面是我的NSFetchResultsController方法:

[inningA number]

在我的班级MatchContextMO中,我收到错误- (NSFetchedResultsController *)fetchedResultsController { // Set up the fetched results controller if needed. //NSLog(@"Inside fetchResultsController "); if (fetchedResultsController == nil) { // Create the fetch request for the entity. NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; [fetchRequest setReturnsObjectsAsFaults:NO]; // Edit the entity name as appropriate. NSEntityDescription *entity = [NSEntityDescription entityForName:@"Match" inManagedObjectContext:managedObjectContext]; [fetchRequest setEntity:entity]; [fetchRequest setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"matchinnings"]]; [fetchRequest setIncludesSubentities:YES]; [fetchRequest setResultType:NSManagedObjectResultType]; //[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"matchinnings.number", nil]]; //[fetchRequest valueForKeyPath:@"matchinnings.number"]; //[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"matchinnings", @"number", nil]]; //[fetchRequest setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"matchinnings.number"]]; //[fetchRequest setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObjects:@"matchinnings", @"matchinnings.number", nil]]; // Edit the sort key as appropriate. NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; [fetchRequest setSortDescriptors:sortDescriptors]; // Edit the section name key path and cache name if appropriate. // nil for section name key path means "no sections". NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"]; aFetchedResultsController.delegate = self; self.fetchedResultsController = aFetchedResultsController; [aFetchedResultsController release]; [fetchRequest release]; [sortDescriptor release]; [sortDescriptors release]; } return fetchedResultsController; } 就行:

EXC_BAD_ACCESS

...在这种方法中:

inningsArray = [newSet allObjects];

我想在最后一周找出答案。它看起来更像CoreData故障。

非常感谢您的帮助。

我尝试迭代返回的集合。在-(NSArray *)determineInningsOrder { NSArray* array = nil; NSSet *newSet = [self.match valueForKey:@"matchinnings"]; NSLog(@"Size of set %d", [newSet count]); NSArray *inningsArray = nil; @try { inningsArray = [newSet allObjects]; } @catch (NSException *exception) { NSLog(@"Exception in matchinnings %@", [exception reason]); } Innings *inningA = [inningsArray objectAtIndex:0]; Innings *inningB = [inningsArray objectAtIndex:1]; if ([inningA isKindOfClass:Innings.class]) NSLog(@"inningA is of type Innings"); Innings* temp; NSNumber *numberA = [inningA valueForKey:@"number"]; NSLog(@"numberA %d", [numberA intValue]); if ([numberA intValue] == 2) { temp = inningA; inningA = inningB; inningB = temp; } array = [NSArray arrayWithObjects:inningA, inningB, nil]; return array; } 行上仍然出现'EXC_BAD_ACCESS'错误。虽然NSLog的大小说明了2。

[a addObject:inningsObject]

7 个答案:

答案 0 :(得分:1)

当然,如果您将CoreData中的某些内容建模为Integer并提供自定义类来实现它。该属性是一个对象:NSNumber

示例:

·H:

// attributes
@property (nonatomic, retain) NSNumber *version;

// derived attributes
@property (nonatomic, readonly) NSInteger versionIntegerValue;
@property (nonatomic, readonly) NSString *versionStringValue;

的.m:

@dynamic version;

- (NSInteger)versionIntegerValue {
  return [self.version integerValue];
}

- (NSString *)versionStringValue {
  return [NSString stringWithFormat:@"v%d", [self.version integerValue]];
}

答案 1 :(得分:0)

inningA或inningB的对象类型是什么? 确保:

  • 该类定义了'number'属性
  • 对象模型定义了'number'属性

如果这些都是正确的,请重新格式化您的问题,以便我们更轻松地阅读。

还要更明确地说你在哪里调用底部函数?并提供MatchContectMO的其余部分。我不确定它是什么?这是MO的定义吗?或者是否包含MO? (这个名字一点也不清楚。)

答案 2 :(得分:0)

如果matchinnings键是多对多关系的名称,那么:

[self.match valueForKey:@"matchinnings"];

...不会返回NSSet而是返回NSMutableSet。当您将它分配给NSSet时:

NSSet *newSet = [self.match valueForKey:@"matchinnings"];
如果您忘记并尝试更改任何内容,它可能会导致问题。

然而,在这种情况下,这可能不是问题。更有可能的是,你根本没有得到一套回归。我确认你得到一个NSMutableSet返回。

我可以告诉你,绝对可以肯定这个问题不是由故障引起的。首先,你明确地没有获取故障,其次,故障不可能导致这种问题。只要访问了一个故障代表对象的属性,就会读入整个对象(用行话中的错误)。故障永远不会触发与属性访问相关的问题。

答案 3 :(得分:0)

您正在使用缓存。这带来了各种各样的问题。我已多次阅读这些文档,但我仍不确定它何时刷新。尝试将缓存更改为nil。可能是缓存中的一个对象不再存储在商店中,并且它正在尝试访问它。

也摆脱这些界限。它们在这个阶段没用,而且你的程序看起来没用:

    [fetchRequest setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"matchinnings"]];
    [fetchRequest setIncludesSubentities:YES];
    [fetchRequest setResultType:NSManagedObjectResultType];

创建了managedObjectContext的位置?它与您运行此代码的线程是否相同?它是否仍有保留计数?试试NSLog(@"MOC Retain count: %i", [managedObjectContext retainCount]);如果它不在同一个帖子中,请确保它是。它不是线程安全的,如果不是,你会得到这些错误。

你是如何设定比赛的?你的代码并不清楚。 NSFetchedResultsController对于填充表视图很有用,但match是一个属性。怎么设置? NSFetchedResultsController是否使用正确的接口?正常的抓取工作也会起作用吗?

如果这些都不起作用,我认为你最好在这里发布整个文件的内容。正如其他人所说,有什么是正确的,而且很难诊断出我们看不到的东西。

答案 4 :(得分:0)

如果没有更多的实施,这有点难以辨别,但我会看看:

  • managedObjectContext对象,托管对象与其拥有的上下文共享生命周期
  • 线程:确保您访问对象并在同一线程上使用拥有的托管上下文

答案 5 :(得分:0)

给出像&#34; number&#34;等属性名称是一个坏主意。或&#34;文字&#34;或者&#34;描述&#34;,除非你故意继承。当您尝试最后一个时,核心数据实际上会发出警告,但它并没有使用所有保留字。来自NSPropertyDescription Class Reference

  

请注意,属性名称不能与NSObject或NSManagedObject的任何无参数方法名称相同。例如,您不能为属性指定名称&#34; description&#34;。 NSObject上有数百个可能与属性名称冲突的方法 - 这个列表可以在没有框架或其他库的警告的情况下增长。你应该避免使用非常通用的单词(例如&#34; font“和”color“)以及与Cocoa范例重叠的单词或短语(例如”isEditing“和”objectSpecifier“)。

始终如一地使用valueForKey:,大部分时间都会绕过此问题,但只要您拨打[inningA number]之类的电话,就会收到错误。

答案 6 :(得分:0)

当我在包含对象处于故障状态时访问一对多关系count时,我遇到了同样的问题myObject.oneToManyRelationshipProperty.count; <- EXC_BAD_ACCESS

relationshipKeyPathsForPrefetching

这似乎可以通过在获取请求期间设置NSFetchRequest *fetchRequest = ... fetchRequest.relationshipKeyPathsForPrefetching = @[@"yourProperty"]; 来解决,这将预先加载&#34;预加载&#34;初始提取期间的关系对象和错误。

Uri uri = Uri.parse("imageURL");

对此解决方案的反馈表示赞赏。我不明白为什么我得到了糟糕的访问权限;不应该访问一个故障只是加载对象(而不是崩溃)?