核心数据:执行提取时出现错误的访问错误
Posted
技术标签:
【中文标题】核心数据:执行提取时出现错误的访问错误【英文标题】:Core Data: Bad Access Error upon Execute Fetch 【发布时间】:2011-03-31 12:13:11 【问题描述】:在 UITableView 的提交中,我使用以下代码删除了一个对象:
[_context deleteObject:[_StudiessList objectAtIndex:indexPath.row]];
NSError *error;
if (![_context save:&error])
// Handle error
NSLog(@"Unresolved error series %@, %@", error, [error userInfo]);
[self LoadData]; // bad access fire here
其中LoadData
是重新填充表格视图的函数
它的代码是:
iPaxeraAppDelegate *appDelegate = (iPaxeraAppDelegate *)[[UIApplication sharedApplication] delegate];
self.context = appDelegate.managedObjectContext;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Studies" inManagedObjectContext:_context];
[fetchRequest setEntity:entity];
NSArray *sortDescriptors = [NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"StudyDate" ascending:YES] autorelease]];
[fetchRequest setSortDescriptors:sortDescriptors];
NSError *error;
@try
// error done here exactly at fetch
self.StudiessList = [_context executeFetchRequest:fetchRequest error:&error];
@catch (NSException * e)
NSLog(e);
[fetchRequest release];
[StudiessList retain];
LoadData
在executeFetchRequest:
上崩溃
【问题讨论】:
你也在泄露StudiesList
。感觉它可能是一个保留属性,对self.StudiessList
的调用已经保留了返回的数组。向它发送另一个保留将导致它泄漏,如果它与在 dealloc 中发送的释放之外的另一个释放不平衡。
如果您遵循样式约定,您的代码将更易于阅读。只有框架名称、类名称和常量应该以大写字母开头。 (另外,StudyssList 拼写错误)。所以StudiessList
应该是studiesList
和LoadData
应该是loadData
。遵循约定将使您的代码更容易被其他人阅读。苹果有一个风格指南埋在某个地方。您应该尝试追踪并关注它。
【参考方案1】:
你的问题可能在这里:
NSArray *sortDescriptors = [NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"StudyDate" ascending:YES] autorelease]];
通过附加一个显式的自动释放,您设置了一种情况,在这种情况下,排序描述符可以在仍然需要时被释放。当 fetch 去抓取排序描述符时,它会因为对象不存在而崩溃。
显式自动释放可能会产生问题,因为它们与定义它们的直接作用域的内存池的耗尽密切相关。尽管许多人随意使用自动释放,但实际上应该只在从方法,因为 autorelease 告诉运行时,“我完全完成了这个对象,我不在乎它会发生什么。”如果你没有完成这个对象,那么你就会遇到问题。
使用便捷方法中的隐式自动释放可以消除这个问题,因为自动释放是在另一个范围内发布的,例如持有便捷方法的类对象。然后它进入本地范围并可以保留,而不必担心本地范围内的自动释放会杀死它。
试试:
NSArray *sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"StudyDate " ascending:YES]];
... 看看是否能解决崩溃问题。
【讨论】:
你能告诉我什么时候发布它,我应该说[sortDescriptor retain]; sortDescriptorWithKey: 是一种方便的方法,它返回一个自动释放的对象,因此您不必释放它。但是,它是在不同的范围内自动发布的,因此它可以防止您现在遇到的问题。 我删除了它,但它引发了同样的错误 [_StudiessList removeObjectAtIndex:indexPath.row];它引发以下错误 -[_PFArray removeObjectAtIndex:]: unrecognized selector sent to instance以上是关于核心数据:执行提取时出现错误的访问错误的主要内容,如果未能解决你的问题,请参考以下文章