gpt4 book ai didi

iphone - 核心数据内存分配

转载 作者:行者123 更新时间:2023-11-29 13:20:42 27 4
gpt4 key购买 nike

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

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];

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

enter image description here

enter image description here

编辑

我最初接受了下面的答案,但它似乎并没有 100% 地解决这个问题。 CFData(存储)仍在分配大量未释放的内存。这最终导致 iPad 2 崩溃,当我接受下面的答案时我没有遇到这种情况,因为我只在 iPad 4 上测试。我希望这能解决所有问题。

编辑 2

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

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

下面是创建条目的代码:

- (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];
}

最佳答案

Core Data 将拥有一定数量的长期内存以执行其功能。也就是说,您可以通过将此代码包装在 @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];

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

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

关于iphone - 核心数据内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14418063/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com