多个对象可以在Objective-C / Cocoa中保留相同的对象吗?

时间:2010-04-26 17:29:56

标签: iphone objective-c cocoa

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

@property (nonatomic, retain) NSMutableArray* fooList;

我用Foos填充它:

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并调用[theFoo release]。然后命中另一个后退按钮,在tableview类上调用dealloc并调用[fooList release]。

您可能认为FooView类应该具有:

@property (nonatomic, assign) Foo* theFoo;

VS。保留。但有时候FooView类是用一个不在数组中的Foo调用的。所以我想确保两个对象保持同一个其他对象是可以的。

3 个答案:

答案 0 :(得分:5)

要回答您的主要问题,是的,您可以保留一个实例的多个对象。这正是引用计数内存管理的重点。有关详细信息,请查看Cocoa Memory Management Programming Guide。然后重新阅读它。它有所有的答案,将成为你最好的朋友。

基本上,发送-retain消息表示发件人“拥有”接收者,因为在所有所有者已经释放所有权之前,接收者不应被解除分配。因此,个别实例不需要知道(也不应该关心)其他所有者是否存在。保留您需要保留的任何内容,并在完成后释放它。当所有所有者已经释放所有权时,可以取消分配intsance。

旁注,

@property (retain,readwrite) NSMutableArray *myArray;

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

答案 1 :(得分:4)

是的,没关系。这就是引用计数内存管理系统的全部内容。

答案 2 :(得分:4)

正如其他人所说,你所做的是正确的,代码对我来说是正确的。我在代码中有几十个对同一个对象的引用,只要我平衡了所有的保留和释放,一切正常。

要添加更多细节......请问:

  

因为NSMutableArray被标记为retain,这意味着其中的所有对象都被保留了吗?

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

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

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

另一件小事......对于每个保留属性,请确保在对象的dealloc方法中有一个释放调用。