gpt4 book ai didi

iphone - NSManagedObjectContext executeFetchRequest 返回不稳定的对象,导致 EXC_BAD_ACCESS、SIGABRT 等

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:09:26 31 4
gpt4 key购买 nike

我的猜测是我在这里缺少对核心数据的一些基本理解,但是这里是:

我的应用程序中有多个提取请求来处理不同事物的检索。在某些情况下,代码运行良好,返回请求的对象。

在某些情况下,它会返回似乎已经释放的对象(例如,稍后尝试引用返回结果的几行代码会给出 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com