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)。