0

在 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:

4

1 回答 1

0

你的问题可能在这里:

NSArray *sortDescriptors = [NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"StudyDate" ascending:YES] autorelease]]; 

通过附加一个显式的自动释放,你设置了一个排序描述符可以在仍然需要的时候被释放的情况。当 fetch 去抓取排序描述符时,它会因为对象不存在而崩溃。

显式自动释放可能会产生问题,因为它们与定义它们的直接作用域的内存池的耗尽密切相关。虽然很多人随意使用自动释放,但你真的应该只在从方法返回值时使用它,因为自动释放运行时告诉运行时,“我已经完全完成了这个对象,我不在乎它会发生什么。” 如果你没有完成这个对象,那么你就会遇到问题。

使用便利方法的隐式自动释放可以消除这个问题,因为自动释放是在另一个范围内发布的,例如持有便利方法的类对象。然后它进入本地范围并可以保留,而不必担心本地范围内的自动释放会杀死它。

尝试:

NSArray *sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"StudyDate " ascending:YES]];

...看看是否可以解决崩溃问题。

于 2011-03-31T15:09:23.167 回答