开发者

Core Data: Bad Access Error upon Execute Fetch

开发者 https://www.devze.com 2023-02-20 19:50 出处:网络
In the commit of UITableView I delete an object using the following code: [_context deleteObject:[_StudiessList objectAtIndex:indexPath.row]];

In the commit of UITableView I delete an object using the following code:

[_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

where LoadData is the function to refill the table view

Its code is:

iPaxeraAppDeleg开发者_JS百科ate *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 crashes upon executeFetchRequest:


Your problem is probably here:

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

By attaching an explicit autorelease you set up a circumstance in which the sort descriptor may be deallocated while it is still needed. When the fetch goes to grab the sort descriptor, it crashes because the object is not there.

Explicit autoreleases can be problematical because they are intimately linked to the draining of the memory pool of the immediate scope they are defined in. Although many people use autorelease casually, you should really only use it when you are returning a value from a method because autorelease tells, the runtime, "I am completely done with this object and I don't care what happens to it." If you are not done with the object, then you will have problems.

Using an implicit autorelease from a convenience method eliminates this problem because the autorelease is issued in another scope e.g. the class object holding the convenience method. It then enters the local scope and can be retained without having to worry about an autorelease in the local scope killing it.

Try:

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

... and see if that resolves the crash.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号