【问题标题】:Objective C - NSManagedObjectContext and NSFetchedResultsController release handlingObjective C - NSManagedObjectContext 和 NSFetchedResultsController 发布处理
【发布时间】:2011-11-29 17:25:44
【问题描述】:

我需要一些关于使用 NSManagedObjectContext 对象进行内存管理的信息。 我在 ipad-App 上编程,我使用核心数据对象。

我的 UIApplicationDelegate 控制着 NSManagedObjectContext:

- (NSManagedObjectContext *)managedObjectContext {
if (__managedObjectContext != nil)
{
    return __managedObjectContext;
}

NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil)
{
    __managedObjectContext = [[NSManagedObjectContext alloc] init];
    [__managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return __managedObjectContext;
}

我正在使用 ManagedObjectContext 的实例来显示我的核心数据对象。 像这样。 示例表视图控制器:

CRMAppDelegate *appDelegate = (CRMAppDelegate*) [[UIApplication sharedApplication] delegate];
self.managedObjectContext = appDelegate.managedObjectContext;

// Initialize NSFetchedResultsController to retrieve data from the database.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Contact" inManagedObjectContext:self.managedObjectContext]];

// Sort results ascending by last name, first name.
NSSortDescriptor *sortDescriptorFirstLetterLastName = [[NSSortDescriptor alloc] initWithKey:@"firstLetterOfLastName" ascending:YES];
NSSortDescriptor *sortDescriptorLastName = [[NSSortDescriptor alloc] initWithKey:@"name_last" ascending:YES];
NSSortDescriptor *sortDescriptorFirstName = [[NSSortDescriptor alloc] initWithKey:@"name_first" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptorFirstLetterLastName, sortDescriptorLastName, sortDescriptorFirstName, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptorFirstLetterLastName release];
[sortDescriptorFirstName release];
[sortDescriptorLastName release];

/*
if ([self.managedObjectContext countForFetchRequest:fetchRequest error:NULL] == 0) {
    [self reloadContactData];
}
 */

// Create NSFetched Results controller instance.
fetchedResultsController = [[NSFetchedResultsController alloc]
                            initWithFetchRequest:fetchRequest
                            managedObjectContext:self.managedObjectContext
                            sectionNameKeyPath:@"firstLetterOfLastName"
                            cacheName:@"ContactsViewCache"];
[fetchRequest release];
self.fetchedResultsController.delegate = self;

// Load data.
NSError *error;
if (![fetchedResultsController performFetch:&error]) {
    // Update to handle the error appropriately.
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}

可以像这样实例化 NSManagedObjectContext 吗?因为,在我测试我的 APP 时,上下文的 retainCount 会增加到 10,即使我在“viewDidUnload”和“dealloc”中释放上下文。

我已经尝试在这样的处理程序类中保留上下文:

- (NSManagedObjectContext *)getManagedObjectContext
{
NSManagedObjectContext *context = [self.managedObjectContext autorelease];

return context;
}

与 NSManagedObjectContext 交互的最佳方式是什么 - 对象和实例? 谢谢我的愚蠢问题:)

【问题讨论】:

  • 第二个代码块中的 self.managedObjectContext 属性是强/保留属性,还是弱/分配?
  • “object”和“instance”是同一个意思。
  • @cocoahero 它是一个保留属性

标签: objective-c ios ipad core-data nsmanagedobjectcontext


【解决方案1】:

retainCount 返回的值是没有意义的。不要费心看它。

使用泄漏工具或heapshot analysis 确定您的应用是否存在泄漏。

【讨论】:

  • 谢谢,我去看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
相关资源
最近更新 更多