我正在执行同步例程的iOS端,并试图保持低内存配置文件。
妈妈有这两个实体:
- NSManaged对象栏
- 与NSManagedObject Foo("fooMembers")的多对多关系
- NSManagedObject Foo
- 到NSManagedObject栏的一个关系
- NSString属性"masterObjectID"
- 许多其他关系和属性
我需要组装一个所有masterObjectID字符串的集合,这些字符串由已经提取的一些条的所有fooMembers持有。为此,我遍历bar的fooMembers(我认为它会引发所有foo的错误),并提取masterObjectID,将它们添加到我的集合中。
masterObjectID字符串不会占用太多内存,但foo会占用太多。
因此,我的解决方案是用一个自动释放池围绕foo故障触发迭代,保留masterObjectID字符串,但希望当我耗尽该池时,foo将从内存中释放:
NSMutableSet *smsetExistingMemberIDs = [NSMutableSet setWithCapacity:[bar.fooMembers count]];
NSAutoreleasePool *subpool = [[NSAutoreleasePool alloc] init]; // POOL
for (Foo *foo in bar.fooMembers)
[smsetExistingMemberIDs addObject:[foo.masterObjectID retain]]; // retain the string so that it will survive the drain
[subpool drain]; // DRAIN
// work with smsetExistingMemberIDs...
但我说得对吗触发故障是否真的会将NSManagedObject放入当前的自动释放池?还是我的泳池宣言和排水是徒劳的?
Wienke,
最简单的答案是在自动发布池中创建一个单独的托管对象上下文(MOC)。这样,当您完成循环时,您可以一次清除所有项目。有了一个单独的主运行中心,你需要倾听变化,但这相当简单。苹果公司有几个例子表明,私人MOCs正是为了这些行为。
Andrew