ARC - 保留子对象NSManagedObjects

时间:2013-01-30 21:01:20

标签: ios automatic-ref-counting

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

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

让我再谈谈我所看到的情况。

Instruments

内容 - [品牌页面]

- (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];
}

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

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

我觉得通过使用应用程序的过程,我最终可能会真正引用核心数据中的每一个数据,这让我很担心,这些孩子即使在我不需要之后也不会被释放它们。

1 个答案:

答案 0 :(得分:1)

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

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

我有点担心你的声明按钮保留托管对象,这听起来不是一个好的设计。如果您将托管对象作为segue的一部分传递,则该按钮不需要具有或保持对它的引用 - 这是视图控制器作业。