Are fired faults released from memory if current autorelease pool is drained?
正在执行同步例程的iOS端,并且正在尝试保持低内存配置文件。
妈妈有以下两个实体:
-
NSManagedObject栏
- 与NSManagedObject Foo的一对多关系(a?foofoombersa€?)
-
NSManagedObject Foo
- 与NSManagedObject条形一对一的关系
- NSString属性是否为" masterObjectIDa"?
- 许多其他关系和属性
我需要汇编所有已获取的某些bar的所有fooMembers持有的所有masterObjectID字符串的集合。
为此,我遍历了bara€? fooMembers-我假设会引发所有foos的错误-并提取masterObjectID,并将它们添加到我的集合中。
masterObjectID字符串不会占用太多内存,但是foos会占用太多内存。
所以我的解决方案是用自动释放池包围foo-fault-firing迭代,保留masterObjectID字符串,但希望当我耗尽该池时将foos从内存中释放:
1 2 3 4 5 6 7 8 9 10 | 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)。这样,完成循环后,您可以一次清除所有项目。使用单独的MOC,您将需要倾听更改,但这很简单。苹果公司有一些示例显示了仅针对此类操作的私人MOC。
安德鲁