核心数据:手动故障管理对象后未释放内存
我使用以下代码来检索Core Data上属性的最大值
- (NSDate*)latestDateForLocalEntity:(NSString*)entityString key:(NSString*)key inManagedObjectContext:(NSManagedObjectContext*)context { NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityString]; NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:key ascending:YES]; request.sortDescriptors = @[sortDescriptor]; NSError *localError; NSArray *localResults = [context executeFetchRequest:request error:&localError]; id result = localResults.lastObject; NSDate *latestLocalDate = [result valueForKey:key]; NSLog(@"Latest local date for entity %@ (%@): %@",entityString,key,latestLocalDate); // fault newly created objects - don`t need to keep them in RAM: [localResults enumerateObjectsUsingBlock:^(NSManagedObject *managedObject, NSUInteger idx, BOOL *stop) { [context refreshObject:managedObject mergeChanges:NO]; }]; // even context reset does not help reducing RAM consumption: [context reset]; localResults = nil; return latestLocalDate;
代码检索所有实体,按值对它们进行排序,并使最后一个对象获得最大值。 然后它尝试(重新)对值进行故障以释放RAM: [context refreshObject:managedObject mergeChanges:NO]
。
但是,内存似乎没有被释放(大约有400,000个non-object
对象被保存在内存中)。
我的代码试图恢复对象并重置托管对象上下文有什么问题? 为什么不释放内存?
如果您只对一个属性的最大值感兴趣,我建议您只获取一个对象
// Sort descending to that the first object is that with the maximum value. NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:key ascending:NO]; [request setSortDescriptors:@[sortDescriptor]]; [request setFetchLimit:1];
然后只有一个对象被加载到内存中,而不是该实体的所有对象。
此外,您只能获取您感兴趣的属性而不是托管对象:
[request setResultType:NSDictionaryResultType]; [request setPropertiesToFetch:@[key]];
然后结果是一个字典数组,并且没有任何托管对象被加载到上下文中。 这里需要注意的是,结果反映了持久性存储中的当前状态,并未考虑上下文中的任何挂起的更改,插入或删除。