2010-04-26 67 views
6

假设我有一个tableview类,它列出了100个Foo对象。它具有:多个对象在Objective-C/Cocoa中保留相同的对象可以吗?

 
@property (nonatomic, retain) NSMutableArray* fooList; 

,我填满它与FOOS像:

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

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

然后,如果用户选择表中的一个特定的行,我想显示一个细节美孚视图我呼吁:现在

 
@property (nonatomic, retain) Foo* theFoo; 

这样既:

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

现在FooView类有数组保持着那个Foo以及FooView。但那似乎没问题吧?当用户点击后退按钮时,将在FooView上调用dealloc,并调用[theFoo release]。然后点击另一个后退按钮,在tableview类上调用dealloc,并调用[fooList release]。

你可能会认为,FooView类应该有:

 
@property (nonatomic, assign) Foo* theFoo; 

与保留。但是有时候FooView类会被一个不在数组中的Foo调用。所以我想确定两个物体放在同一个物体上是可以的。

回答

4

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

添加更多细节...你问:

因为NSMutableArray被标记为保留,这意味着它里面的所有对象也保留呢?

这些是两个不同的东西。所有集合类(字典,数组,集合)都会自动保留添加到它们的内容,并在收集对象被释放时释放它们的内容对象。 (在NSMutableArray的情况下,如果您从数组中单独删除内容对象,或者当您释放整个数组时,内容对象将被释放。)

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

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

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

+0

Typo:“...并在收集对象被释放时释放它们的内容对象。” 集合中的对象在释放*之前不会被释放。 – JeremyP 2010-04-27 08:57:39

+0

谢谢,修复。虽然你可以争辩说,通过“发布”,我的意思是“最后一个版本,保留数量为零,这会触发dealloc”:P,但只是说在这种情况下dealloc更清晰。 – Jaanus 2010-04-27 15:23:56

4

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

5

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

基本上,发送-retain消息表明发件人“拥有”的意义上,接收器不应该被释放,直到所有业主们发布了他们的所有权的接收器。因此,个别实例不需要知道(也不应该关心)其他所有者是否存在。保留你需要保留的任何东西,并在完成后释放它。当全部业主已经释放所有权时,可以释放一笔资金。

在一个侧面说明,

@property (retain,readwrite) NSMutableArray *myArray; 

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