【问题标题】:ARC - Retaining child objects NSManagedObjectsARC - 保留子对象 NSManagedObjects
【发布时间】:2013-01-30 21:01:20
【问题描述】:

我有一个 Button 是否正确,它基本上将 NSManagedObject 传递给 segue 以加载下一个视图,在下一个视图中我加载父 NSManaged 对象的子对象。当我销毁该控制器时,NSManagedObject 仍与子按钮一起保留在原始按钮中。我假设它会在我下次加载相同的数据时被释放,因为它会覆盖 NSManaged 对象的该属性。但是保留所有这些子对象是不好的还是正常的?

我应该/我可以通过在某个时候将该属性设置为 nil 来手动释放这些子项吗?

让我为我所看到的内容提供更多背景信息。

-[品牌页面]的内容

- (NSArray *) pages {


  NSLog(@"%@", [self edetail]);

  if ([self edetail] != nil) {

    NSArray *pgs = [[[self edetail] pages] allObjects];
    return [pgs sortedArrayUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"sort_order" ascending:YES]]];
  }
  return [NSArray array];
}

假设我有一个 objectA 的 NSArray,我们是一个 NSSet,我从 coredata 中提取并排序。然后我遍历 Array 中的每个 objectA 并创建一个自定义按钮类,该类的属性设置为 objectA。单击该按钮时,我会向 UINavigationController 发送一条消息,以转到使用该 ObjectA 拉取某个子数组/ObjectA 集并在自定义网格中显示数据的页面。

根据仪器,当我弹出我已将 ObjectA 传递给的 UIViewController 时,ObjectA 仍保留那些子对象,而我的按钮仍保留 ObjectA。这真的是一个糟糕的设计吗?这似乎并不比我的 RootViewController 保留这些对象的 NSArray 并按索引调用它们更糟糕。

我觉得在使用该应用程序的过程中,我最终可能会实际引用核心数据中的每条数据,这让我担心,即使我不需要这些孩子也不会被释放他们。

【问题讨论】:

    标签: ios automatic-ref-counting


    【解决方案1】:

    托管对象上下文负责托管对象的内存管理。这是一个可怕的句子。

    如果您修改托管对象的属性或创建新对象,则假设您希望它们保留在 MOC 中,除非您将其回滚或不保存。如果您有一个托管对象保存在一个强属性中,那么您并没有泄漏或真正使用额外的内存 - 如果 MOC 遇到内存压力,它将把对象变成故障。

    我有点担心您关于按钮 保留托管对象的说法,这听起来不是一个好的设计。如果您将托管对象作为 segue 的一部分传递,则按钮不需要拥有或保留对它的引用——这就是视图控制器的工作。

    【讨论】:

    • 它是一个包裹在视图控制器中的按钮。但是你的意思是我不应该用用于生成它的 NSManagedObject 加载每个视图控制器,然后将 NSManagedObject 的实例传递给我的导航控制器中的下一个推送序列?
    • 我不明白你的第一条评论。重新编辑,我个人认为视图控制器保留的数组更好(更多 MVC) - 但你所拥有的将起作用,这是一个品味问题。我认为您无需担心内存管理。
    • k,听起来不错,我只是担心内存占用会随着将更多数据附加到我的 NSManagedObjects 上而增加。
    • CoreData 的 _PFAllocate 对象似乎是唯一保留它的东西,所以我想这与 ManagedObjectContext 不同,所以我不必担心太多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多