核心数据:执行提取时出现错误的访问错误

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];

LoadDataexecuteFetchRequest: 上崩溃

【问题讨论】:

你也在泄露StudiesList。感觉它可能是一个保留属性,对self.StudiessList 的调用已经保留了返回的数组。向它发送另一个保留将导致它泄漏,如果它与在 dealloc 中发送的释放之外的另一个释放不平衡。 如果您遵循样式约定,您的代码将更易于阅读。只有框架名称、类名称和常量应该以大写字母开头。 (另外,StudyssList 拼写错误)。所以StudiessList 应该是studiesListLoadData 应该是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

以上是关于核心数据:执行提取时出现错误的访问错误的主要内容,如果未能解决你的问题,请参考以下文章

访问共享进程内存时出现分段错误(核心转储)

尝试执行茎文件时出现分段错误(核心转储)

执行 vba 查询 ms 访问时出现运行时错误 3075

通过 JDBC 从 Spark 提取表数据时出现 PostgreSQL 错误

使用核心数据时出现不一致错误

核心数据:重新打开文档时出现奇怪的绑定错误。帮助?