关于ios:如果当前的自动释放池已耗尽,是否会从内存中释放触发的错误?

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。

安德鲁