以下是作为我的一个托管对象实体的类别中的类方法实现的,其中包含许多其他操作:
+ (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对吗?但它无论如何都不能为零,因为“围兜”是这些实体的关键,没有它就永远不会创造。在这个阶段,没有任何东西从商店中删除,这是一个自上次添加以来已经保存的新店。
答案 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友好。