gpt4 book ai didi

iphone - NSFetchRequest 内存问题

转载 作者:行者123 更新时间:2023-11-29 04:24:18 26 4
gpt4 key购买 nike

我已经就与此相关的不同事情发布了类似的问题,但已经为此苦苦挣扎了大约一周,但无济于事。这一切都归结为这段代码:

NSFetchRequest *oldFetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *oldEntryEntity = [NSEntityDescription entityForName:@"Media"
inManagedObjectContext:oldContext];
[oldFetchRequest setEntity:oldEntryEntity];
[oldFetchRequest setFetchBatchSize:10];
NSArray *medias = [oldContext executeFetchRequest:oldFetchRequest error:&error];

int i = 0;

int count = [oldContext countForFetchRequest:oldFetchRequest error:nil];

NSLog(@"count: %i", count);

while (i < count) {
@autoreleasepool {
NSManagedObject *media = [medias objectAtIndex:i];

[oldContext refreshObject:media mergeChanges:NO];

NSLog(@"i: %i", i);
i++;
}
}

计数应达到大约 250,即媒体 项目的数量。实际上,在应用程序耗尽内存并崩溃之前,它会达到大约 100。每次运行此代码时,它都会建立越来越多的内存,大概是因为每个 media 都包含许多 NSData 属性,包括一个大的属性。每次运行代码时,仪器都会显示内存增加。

我添加了

@autoreleasepoolrefreshObject:mergeChanges: 来尝试解决此问题,但它们没有起作用。

我想要做的是将所有项目从该商店手动移至新商店,因为标准迁移不适用于大数据。这是起点。

最佳答案

对于每个media,您都分配一个NSManagedObject的新实例。相反,您可以定义一个 media 实例并重用它。

此外,我相信您实际上可以使用 NSFetchedResultsController ,它针对迭代一组获取结果进行了优化,并且具有各种幕后内存优化功能。

然后你可以像这样简单地迭代:

for (id object in _fetchedResultsController.fetchedObjects)

我认为这两个建议应该会显着减少内存占用。

关于iphone - NSFetchRequest 内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12573529/

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