Ios 核心数据:手动对托管对象进行故障处理后未释放内存

Ios 核心数据:手动对托管对象进行故障处理后未释放内存,ios,objective-c,core-data,memory-management,automatic-ref-counting,Ios,Objective C,Core Data,Memory Management,Automatic Ref Counting,我使用以下代码检索核心数据上属性的最大值 - (NSDate*)latestDateForLocalEntity:(NSString*)entityString key:(NSString*)key inManagedObjectContext:(NSManagedObjectContext*)context { NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityString

我使用以下代码检索核心数据上属性的最大值

- (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:
[上下文刷新对象:managedObject合并更改:否]

然而,内存似乎没有被释放(大约有400.000个
非对象
对象被保存在内存中)

我的代码试图重构对象并重置托管对象上下文有什么问题?
为什么它不释放内存?

如果您只对一个属性的最大值感兴趣,我建议您使用

// 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]];
然后,结果是一个字典数组,并且没有加载托管对象
完全融入上下文。这里需要注意的一点是,结果反映了持久存储中的当前状态,不考虑上下文中任何挂起的更改、插入或删除。

如果您只对一个属性的最大值感兴趣,我建议您只获取一个具有

// 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]];
然后,结果是一个字典数组,并且没有加载托管对象
完全融入上下文。这里需要注意的一点是,结果反映了持久存储中的当前状态,并且没有考虑上下文中任何挂起的更改、插入或删除。

但是为什么即使我的代码尝试释放对象,内存消耗仍然如此之高?我在整个代码中使用
refreshObject:mergeChanges:NO
,并且到处都有相同的内存问题。@AlexR:可能是自动删除的对象。在这种情况下,本地
@autoreleasepool
会有所帮助。我如何克服您的警告?获取请求应包括所有挂起的更改。@AlexR:“警告”仅适用于我答案的第二部分(NSDictionaryResultType)。如果您需要挂起的更改,那么您可以只实现第一部分(fetchLimit=1)。但是为什么即使我的代码尝试释放对象,内存消耗仍然如此之高?我在整个代码中使用
refreshObject:mergeChanges:NO
,并且到处都有相同的内存问题。@AlexR:可能是自动删除的对象。在这种情况下,本地
@autoreleasepool
会有所帮助。我如何克服您的警告?获取请求应包括所有挂起的更改。@AlexR:“警告”仅适用于我答案的第二部分(NSDictionaryResultType)。如果需要挂起的更改,那么可以只实现第一部分(fetchLimit=1)。