【发布时间】:2010-10-25 02:50:49
【问题描述】:
我有两个 UITableViewControllers 具有相当简单的 ui 流程。当您在第一个 UITableViewController 中选择一个项目时,一个 UITableViewController 会加载另一个 UITableViewController。
(UITableViewController) 故事列表 -> 选择一个故事 -> (UITableViewController) 句子列表
在第二个 UITableViewController (MakeSentenceDetailViewController) 中,我无法释放我的 NSFetchedResultsController 而不会导致错误(显示为 Zombies 设置为 on):
-[NSFetchRequest release]:消息发送到释放的实例0x5b370f0
NSFetchedResultsController 的保留计数保持在 1,但是当我尝试在 dealloc 中释放它时,我遇到了崩溃。
代码,尤其是关于 NSFetchedResultsController 的代码在两个表视图中是相同的,但是在 MakeSentenceDetailViewController 中,我无法在崩溃时释放这个 NSFetchedResults 控制器 - 给我一个泄漏。
如何安全地释放我的 NSFetchedResultsController?为什么它在父(第一个)tableviewcontroller 中工作正常 - 但在第二个中却不行?
我可以为第一个 UITableViewController 提供代码,但关于 NSFetchedResultsController 它的声明和使用方式几乎相同。
MakeSentenceTableViewController.h:
@interface MakeSentenceTableViewController : UITableViewController {
NSManagedObjectContext *managedObjectContext;
NSFetchedResultsController *fetchedResultsController;
}
@property (nonatomic, retain) Story *story;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@end
MakeSentenceTableViewController.m(与 NSFetchedResultsController 相关的代码):
- (void)viewDidLoad {
[super viewDidLoad];
if (managedObjectContext == nil)
{
managedObjectContext = [(MyAppAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSLog(@"After managedObjectContext: %@", managedObjectContext);
}
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Sentence" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
//sorting stuff:
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"order" ascending: YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects: sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
//[request setFetchBatchSize:FETCH_BATCH_SIZE];
[sortDescriptors release];
[sortDescriptor release];
fetchedResultsController = [[NSFetchedResultsController alloc]
initWithFetchRequest:request managedObjectContext:managedObjectContext
sectionNameKeyPath:nil cacheName:nil];
[request release];
NSError *error;
[fetchedResultsController performFetch:&error];
NSLog(@"FetchedResultsController: %@", fetchedResultsController);
NSLog(@"fetchedResultsController RetainCount at viewDidLoad: %d", [fetchedResultsController retainCount]);
}
- (void)dealloc {
//Gotta figure out why I can't release this:
[fetchedResultsController release]; //Crash! Burn!
NSLog(@"fetchedResultsController RetainCount at dealloc: %d", [fetchedResultsController retainCount]);
[managedObjectContext release];
[super dealloc];
}
【问题讨论】:
标签: iphone cocoa-touch core-data release-management nsfetchedresultscontroller