核心数据内存分配

在我的应用程序中,我使用核心数据来存储信息。 当应用程序最初启动时,将调用此代码块来获取数据:

NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName: @"Customer" inManagedObjectContext: managedObjectContext]; request.entity = entity; NSError *error = nil; Array = [[managedObjectContext executeFetchRequest: request error: &error] mutableCopy]; NSArray * reversedArray = [[Array reverseObjectEnumerator] allObjects]; [Array release]; Array = nil; [request release]; [error release]; 

所以一切都正常,但是分配的内存非常大,没有被释放,我似乎无法弄明白。 您可以通过下面的屏幕截图看到。 任何帮助都会很棒。

在此处输入图像描述

在此处输入图像描述

编辑

我最初接受了下面的答案,但似乎并没有100%摆脱这个问题。 CFData(商店)仍在分配大量未被释放的内存。 这最终导致iPad 2崩溃,当我接受下面的答案时我没有体验到,因为我只是在iPad 4上进行测试。我希望这可以解决所有问题。

编辑2

所以我一直在做更多的测试和调试,似乎添加到核心数据的条目越多,CFData(商店)就越大。 目前,数据库中只有10个单独的条目,当打开应用程序时,获取它们的分配大于25mb。 主要实体“客户”与其他更大的实体有多种关系。 因此,当我预先形成“Customer”的提取时,正在获取与其有关系的每个实体,这导致巨大的内存分配。 有办法解决这个问题吗?

我猜想必须有一个更好的方法来设置条目的添加方式和提取方式。

以下是创建条目的代码:

 - (void) addItem { // Insert a new record in the database Customer * customerItem = [NSEntityDescription insertNewObjectForEntityForName: @"Customer" inManagedObjectContext: managedObjectContext]; System * system = [NSEntityDescription insertNewObjectForEntityForName: @"System" inManagedObjectContext: managedObjectContext]; Form1 * form1 = [NSEntityDescription insertNewObjectForEntityForName: @"Form1" inManagedObjectContext: managedObjectContext]; Form2 * form2 = [NSEntityDescription insertNewObjectForEntityForName: @"Form2" inManagedObjectContext: managedObjectContext]; Form3 * form3 = [NSEntityDescription insertNewObjectForEntityForName: @"Form3" inManagedObjectContext: managedObjectContext]; Form4 * form4 = [NSEntityDescription insertNewObjectForEntityForName: @"Form4" inManagedObjectContext: managedObjectContext]; Form6 * form6 = [NSEntityDescription insertNewObjectForEntityForName: @"Form6" inManagedObjectContext: managedObjectContext]; Form7 * form7 = [NSEntityDescription insertNewObjectForEntityForName: @"Form7" inManagedObjectContext: managedObjectContext]; Form8 * form8 = [NSEntityDescription insertNewObjectForEntityForName: @"Form8" inManagedObjectContext: managedObjectContext]; Form9 * form9 = [NSEntityDescription insertNewObjectForEntityForName: @"Form9" inManagedObjectContext: managedObjectContext]; Form10 * form10 = [NSEntityDescription insertNewObjectForEntityForName: @"Form10" inManagedObjectContext: managedObjectContext]; Form11 * form11 = [NSEntityDescription insertNewObjectForEntityForName: @"Form11" inManagedObjectContext: managedObjectContext]; customerItem.system = system; customerItem.form1 = form1; customerItem.form2 = form2; customerItem.form3 = form3; customerItem.form4 = form4; customerItem.form6 = form6; customerItem.form7 = form7; customerItem.form8 = form8; customerItem.form9 = form9; customerItem.form10 = form10; customerItem.form11 = form11; // Insert a new item in the table's data source [customerArray insertObject: customerItem atIndex: 0]; [managedObjectContext save: &error]; // Insert a new row in the table NSIndexPath *indexPath = [NSIndexPath indexPathForRow: 0 inSection: 0]; [table insertRowsAtIndexPaths: [NSArray arrayWithObject: indexPath] withRowAnimation: UITableViewRowAnimationFade]; } 

核心数据将具有一定数量的长期内存,以便执行其function。 也就是说,您可以通过将此代码包装在@autorelease池中来确保最小化内存使用,如下所示:

 @autoreleasepool { NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName: @"Customer" inManagedObjectContext: managedObjectContext]; request.entity = entity; NSError *error = nil; Array = [[managedObjectContext executeFetchRequest: request error: &error] mutableCopy]; NSArray * reversedArray = [[[Array reverseObjectEnumerator] allObjects] retain]; [Array release]; Array = nil; [request release]; [error release]; } [reversedArray autorelease]; 

即使您已经小心地释放了您创建的所有对象,自动释放模式也会在整个系统框架中广泛使用。

请注意,添加此@autoreleasepool ,您需要保留reversedArray ,以使其持续退出池的范围。 之后我添加了[reversedArray autorelease] ,因此代码在语义上与您发布的代码完全相同(除了释放由执行获取请求而创建的任何自动释放的对象。)