coredata数据获取增加内存使用ios

时间:2017-06-02 11:48:57

标签: ios objective-c iphone core-data memory-leaks

我正在使用coredata(第一次使用)来保存大量的数据(图像,视频路径,HTML文本) 当我使用prdicate fetchRequest 获取数据时NSArray每次内存使用量增加10到15 mb。有时它会越过400-500mb..app减速,但不会崩溃

我想知道,它通常在核心数据库中吗? 是否有任何方法来获取数据而不增加内存使用量。?

如果没有,那么我该如何解决这个问题呢。 如果有人知道原因或任何想法,请分享。

memory usage image

我的代码如下所示

-(void)GetDatafromPrimaryKey:(NSString *)PrimaryKeyTxt EntityName:(NSString *)EntityName {

NSError *error = nil;
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:EntityName  inManagedObjectContext: context];
[fetch setEntity:entityDescription];
[fetch setPredicate:[NSPredicate predicateWithFormat:@"primaryKey == %@",PrimaryKeyTxt]];
// [fetch setIncludesPropertyValues:NO];
[fetch setShouldRefreshRefetchedObjects:NO];

chatAry = [context  executeFetchRequest:fetch  error:&error];
NSLog(@"---> %lu",(unsigned long)chatAry.count);
if (error != nil) {
    // Deal with failure
}
else {
 }
 }

2 个答案:

答案 0 :(得分:0)

首先,如果您可以共享用于从Coredata获取数据的代码段,那么找到解决问题的方法确实很有帮助。

问题可能在于应用程序的体系结构。但是,有关更多信息,我想指出当您在Coredata中访问BLOB时Apple提供的2条建议。

  

如果迭代很多对象,则可能需要使用本地自动释放池块来确保尽快释放临时对象。

     

如果您不打算使用Core Data的撤消功能,请通过将上下文的撤消管理器设置为nil来减少应用程序的资源需求。这对后台工作线程以及大型导入或批处理操作尤其有用。

使用这些简单的提示,您应该能够减少内存使用量。

有关详细信息,请参阅:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/Performance.html#//apple_ref/doc/uid/TP40001075-CH25-SW11

希望这有帮助。

答案 1 :(得分:0)

将图像保存到CoreData不是一个好主意。您应该将它们保存到磁盘,并且可能在CoreData中具有路径。更好的是,如果该图像发生变化,您可以使用NSCache。

如果处理大量数据,请使用:

[fetch setLimit:20];

https://developer.apple.com/reference/coredata/nsfetchrequest/1506622-fetchlimit?language=objc

您最有可能在屏幕上显示最多20个元素,那么为什么只需要少量数据就可以获取所有数据?