Ios 核心数据提取请求使用大量内存

Ios 核心数据提取请求使用大量内存,ios,objective-c,core-data,memory-management,Ios,Objective C,Core Data,Memory Management,我正在努力理解核心数据和一个简单的获取请求的问题: 我需要显示一些记录并执行这些代码行 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; [fetchRequest setEntity:[NSEntityDescription entityForName:@"Venue" inManagedObjectContext:self.managedObj

我正在努力理解核心数据和一个简单的获取请求的问题:

我需要显示一些记录并执行这些代码行

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Venue"                                     
inManagedObjectContext:self.managedObjectContext]];

 NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"id_" ascending:YES]; 

NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];  
[sortDescriptor release];
sortDescriptor = nil;

[fetchRequest setSortDescriptors:sortDescriptors]; 
[sortDescriptors release];
sortDescriptors = nil;

[self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
到目前为止还不错,但在仪器中我可以看到,在加载记录之前,我的内存是9mb,之后,内存跳到44mb(!!),并且仍然存在。但我想从内存中释放所有记录,因为我不再需要它们了。我错过什么了吗?我以为核心数据是在不再需要这些记录之后发布的。我试着做一个for循环来释放每个ManagedObject,但它们已经是+1计数,这意味着它们很快就会被释放。

您应该释放请求
[请求释放]

如果您不再需要NSManagedObject,可以手动将其恢复为故障。i、 e.将它们从NSManagedObjectContext中删除。下次需要它们时,它们将再次从持久存储中加载

我这样做是为了在与服务器同步和更新对象时节省内存,但我不需要立即使用它们

若要重新设置错误,请使用此选项(并阅读有关其用法的API文档)


对不起,忘了提到的是iOSTry:在模拟器/仪器上运行。重新创建到44mb。然后在模拟器中“强制内存警告”,查看内存是否恢复为核心数据“故障”受管对象。不幸的是,我无法在模拟器上运行,因为有些框架。我更新了代码,但没有成功:(NSFetchRequest*fetchRequest=[NSFetchRequest fetchRequestWithEntityName:@“场地”];fetchRequest.returnsObjectsAsFaults=no;NSManagedObjectContext*moc=[[NSManagedObjectContext alloc]init];NSPersistentStoreCoordinator*coordinator=[self-persistentStoreCoordinator];[moc setPersistentStoreCoordinator:coordinator];n错误*错误;[moc executeFetchRequest:fetchRequest错误:&错误];[moc重置];[moc释放];[coordinator释放];1.设置fetch request以将对象返回为faults==是。故障占用的内存较少,但会使访问速度变慢。2.您将从执行请求返回的托管对象存储在哪里?我正在释放它,但内存仍然存在。一些问题:1.iOS设备或模拟器?2.您稍后如何处理提取的数据?3.提取了多少行?。iOS。现在我对提取的数据不做任何事情,只是把所有东西都扔掉。大约1500行的提取EDI上传了测试项目的zip文件www.digitalvanilla.com/test.zipwell,我尝试了所有方法,但没有任何效果:NSZombie被禁用(如本文所示),我还添加了一个自动释放池对象块,并在提取行之后不久将其排空,我从实体中创建了一个类对象,并在dealoc方法中放置了一个简单的NSLog。我可以看到,每个记录都按预期释放,这是保存核心数据对象的主对象(上下文…)被释放,上下文也被重置,所有东西都消失了,我的内存文件中仍然有数据,由于某种原因我无法释放。因此,在仪器分配中,您可以看到使用该内存的跟踪信息?尝试更改为调用堆栈,反转调用树,隐藏系统库…并查看代码中是否有任何东西是我们的我已经在iOS 5.0模拟器上运行了你的应用程序,活动字节只有850KB…?总字节是80MB-但这是内存,其中包括已释放和销毁的对象。活动字节是你应该关心的…你在哪里看到44MB?@DigitalVanilla尝试使用MagicalRecords框架,你将拥有更少的内存d干净的代码-(NSArray*)场馆{NSManagedObjectContext*moc=[self-managedObjectContext];NSFetchRequest*fetchRequestWithEntityName:@“场馆”];[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:[NSSortDescriptor SortDescriptor WithKey:@“id\ux”升序:是],nil]];NSArray*arr=[[moc executeFetchRequest:fetchRequest错误:nil]retain];NSLog(@“arr count%d”,[arr count]);return nil;}我使用[retain]作为结果数组来测量内存消耗尝试这段代码,但不保留结果数组,我总共大约有1MB
- (void)refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flag