核心数据 - 访问从 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 数据?