如果当前自动释放池已耗尽,则是否从内存中释放激发的故障



我正在执行同步例程的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

相关内容

  • 没有找到相关文章

最新更新