我的猜测是我在这里缺少对核心数据的一些基本理解,但是这里是:
我的应用程序中有多个提取请求来处理不同事物的检索。在某些情况下,代码运行良好,返回请求的对象。
在某些情况下,它会返回似乎已经释放的对象(例如,稍后尝试引用返回结果的几行代码会给出 EXC_BAD_ACCESS)。当我在代码中设置各种断点和日志语句并单步执行时,偶尔也会在代码的其他位置出现 SIGABRT 或 EXC_BAD_ACCESS。
在每种情况下,似乎都是在我去引用获取请求的结果时。
这是一个这样的获取请求的示例:
// Who am I?
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *signedInPersonId = [defaults stringForKey:@"signedInPersonId"];
// Return (if any) the Request object with given UUID
RequestStrings *r = [[RequestStrings alloc] init];
NSEntityDescription *description = [NSEntityDescription entityForName:r.table_Request inManagedObjectContext:moc];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(UUID == %@) && (dataOwnerId == %@)", UUID, signedInPersonId];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:description];
[request setPredicate:predicate];
NSError *error = nil;
NSArray *requests = [moc executeFetchRequest:request error:&error];
Request *returnRequest = nil;
if (requests != nil) {
if ([requests count] > 0) {
NSLog(@"getRequestWithId - requests array: %@, first: %@", requests, [requests objectAtIndex:0]);
returnRequest = [requests objectAtIndex:0];
}
else {
returnRequest = nil;
}
}
[r release];
[request release];
return returnRequest;
附言这是更多信息
在某些情况下,相同的代码将返回所需的对象,或抛出一个异常,指出 [NSCFNumber length] 是一个无法识别的选择器。不确定相同的实体描述 + 获取请求如何在一种情况下返回数组而在另一种情况下返回数字。
最佳答案
你基本上是这样做的:
// (1) Create an array of stuff
NSArray *myArray = [NSarray arrayWithObjects:a, b, c, nil];
// (2) Take the first one off
id myObject = [myArray objectAtIndex:0];
// (3) Release everything
[myArray release];
// (4) Return myObject
return myObject;
您只是在使用 CoreData 执行步骤 (1)。
步骤 (1) 返回一个对象数组。唯一保留这些对象的是它们所在的数组*。如果释放数组(第 3 步),您将释放其中的所有对象。为什么你期望 myObject 在步骤 (4) 之前仍然存在?
试试这个:
// Make sure that we keep a retain of returnRequest
returnRequest = [[[requests objectAtIndex:0] retain] autorelease];
*对于那里的学究:我做了一个假设,使我的回答更简单。在现实世界中,您不知道是什么保留了您的对象——这取决于框架和您的代码。但是,最好保留任何您希望保留的东西。
关于iphone - NSManagedObjectContext executeFetchRequest 返回不稳定的对象,导致 EXC_BAD_ACCESS、SIGABRT 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6660851/