如果当前的自动释放池被耗尽,是否会从内存释放故障?

时间:2012-02-13 20:52:52

标签: ios core-data nsmanagedobject nsautoreleasepool

我正在做同步例程的iOS端,我正试图保持低内存配置文件。

妈妈有这两个实体:

  • NSManagedObject Bar
    • 与NSManagedObject Foo(“fooMembers”)
    • 的多对多关系
  • NSManagedObject Foo
    • 与NSManagedObject Bar的一对一关系
    • NSString属性“masterObjectID”
    • 许多其他关系和魅力

我需要汇集一些所有masterObjectID字符串的集合,这些字符串是由已经获取的一些条形图的所有fooMembers所拥有的。 要做到这一点,我遍历吧'fooMembers - 我假设它会解决所有foos的错误 - 并提取masterObjectIDs,将它们添加到我的集合中。

masterObjectID字符串不会占用太多内存,但是foos会这样做。

所以我的解决方案是围绕foo的故障烧迭代有一个自动释放池,保留masterObjectID字符串,但希望该FOOS会从内存中释放时我排的是池:

    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放入当前的自动释放池?或者我的游泳池宣言和排水是徒劳的?

1 个答案:

答案 0 :(得分:1)

Wienke,

最简单的答案是在自动释放池中创建单独的托管对象上下文(MOC)。这样,当您完成循环后,您可以一次清除所有项目。使用单独的MOC,您需要监听更改,但这很简单。 Apple有几个例子显示私人MOC只是为了这些行为。

安德鲁