代码之家  ›  专栏  ›  技术社区  ›  Andrew Arrow

多个对象可以将同一个对象保留在objective-c/cocoa中吗?

  •  6
  • Andrew Arrow  · 技术社区  · 16 年前

    假设我有一个列出100个foo对象的TableView类。它有:

    @property (nonatomic, retain) NSMutableArray* fooList;
    

    我用FOO填满它,比如:

    self.fooList = [NSMutableArray array];
    while (something) {
      Foo* foo = [[Foo alloc] init];
      [fooList addObject:foo];
      [foo release];
    }
    

    第一个问题:因为nsmutableArray被标记为retain,这意味着它里面的所有对象也被保留了?我是否正确地添加了foo并在本地副本添加到数组后释放它?还是我错过了一个保留电话?

    然后,如果用户选择表中的一个特定行,并且我希望显示我调用的详细foo视图:

    FooView* localView = [[FooView alloc] initWithFoo:[self.fooList objectAtIndex:indexPath.row]];  
    [self.navigationController pushViewController:localView animated:YES];
    [localView release];
    

    现在fooview类有:

    @property (nonatomic, retain) Foo* theFoo;
    

    所以现在,两个阵列都能抓住那个foo和fooview。但看起来没问题,对吧?当用户点击后退按钮时,将在fooview上调用dealloc,并调用[foo release]。然后点击另一个后退按钮,在TableView类上调用DealLoc,并调用[傻瓜释放]。

    您可能会认为fooview类应该具有:

    @property (nonatomic, assign) Foo* theFoo;
    

    与保留。但有时使用数组中不存在的foo调用fooView类。所以我想确定让两个物体抓住另一个物体是可以的。

    3 回复  |  直到 16 年前
        1
  •  4
  •   Jaanus    16 年前

    正如其他人所说,您所做的是正确的,代码在我看来是正确的。我的代码中有几十个对同一对象的引用,只要我平衡了所有的保留和发布,一切都会正常工作。

    添加更多细节…你问:

    因为nsmutableArray被标记为retain,这意味着它里面的所有对象也都被保留了?

    这是两件不同的事情。所有集合类(字典、数组、集合)都会自动保留添加到它们中的内容,并在取消分配集合对象时释放它们的内容对象。(对于nsmutableArray,如果从数组中单独删除内容对象,或者取消分配整个数组,则会释放该内容对象。)

    这与集合对象本身是作为属性保留还是分配无关。唯一需要考虑的是,如果集合对象属性的策略不正确,它可能会比您认为的早或晚发布,并且可能会失去平衡。

    正如其他人所说…阅读 memory management guide 和练习。:)哦,从这个角度也可以阅读其他人的代码,并尝试理解他们是如何/为什么进行内存管理的。

    还有一件小事…对于每个保留的属性,请确保在对象的dealloc方法中有一个release调用。

        2
  •  5
  •   Barry Wark    16 年前

    要回答您的主要问题,可以选择多个保留实例的对象。这正是参考点计数内存管理。看看可可 Memory Management Programming Guide 更多信息。然后重新阅读。它有所有的答案,将是你最好的朋友。

    基本上,发送 -retain 消息表示发送方“拥有”接收方,即在以下情况下不应解除分配接收方: 全部的 所有人已经释放了他们的所有权。因此,个别实例不需要知道(也不应该关心)其他所有者是否存在。保留任何你需要保留的东西,当你完成后释放它。什么时候? 全部的 所有者已经释放了他们的所有权,一个Intsance可以被交易。

    侧记,

    @property (retain,readwrite) NSMutableArray *myArray;
    

    声明声明声明此属性的类将保留 NSMutableArray 实例。 NSArray , NSDictionary NSSet (及其可变子类)始终保留其内容。

        3
  •  4
  •   Carl Norum    16 年前

    是的,没关系。这就是参考计数内存管理系统的全部要点。