And*_*row 6 iphone cocoa objective-c
假设我有一个列出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;
与保留.但有时候FooView类是用一个不在数组中的Foo调用的.所以我想确保两个对象保持同一个其他对象是可以的.
要回答您的主要问题,是的,您可以保留一个实例的多个对象.这正是引用计数内存管理的重点.有关详细信息,请查看"可可内存管理编程指南".然后重新阅读它.它有所有的答案,将成为你最好的朋友.
基本上,发送-retain消息表明发送者"拥有"接收者,因为在所有所有者已经释放所有权之前不应该取消分配接收者.因此,个别实例不需要知道(也不应该关心)其他所有者是否存在.保留您需要保留的任何内容,并在完成后释放它.当所有所有者都已经释放所有权时,可以取消分配intsance.
在旁注,
@property (retain,readwrite) NSMutableArray *myArray;
Run Code Online (Sandbox Code Playgroud)
声明声明此属性的类将保留NSMutableArray实例.NSArray,, NSDictionary和NSSet(及其可变子类)始终保留其内容.
正如其他人所说,您所做的事情是正确的,并且代码对我来说看起来是正确的。我的代码中有数十个对同一对象的引用,只要我平衡了所有保留和释放,一切都会正常工作。
要添加更多细节...您会问:
因为 NSMutableArray 被标记为保留,这意味着它里面的所有对象也被保留?
这是两件不同的事情。所有集合类(字典、数组、集合)都会自动保留您添加到其中的内容,并在集合对象被释放时释放其内容对象。(对于 NSMutableArray,如果您从数组中单独删除内容对象,或者当您释放整个数组时,内容对象就会被释放。)
这与集合对象本身是保留还是分配为属性无关。唯一需要考虑的是,如果您对集合对象属性的策略不正确,它可能会比您想象的更早或更晚被释放,并且事情可能会失去平衡。
正如其他人所说...阅读内存管理指南并进行练习。:) 哦,也从这个角度阅读其他人的代码,并尝试理解他们如何/为什么进行内存管理。
另一件小事...对于每个保留的属性,确保在对象的 dealloc 方法中有一个释放调用。
| 归档时间: |
|
| 查看次数: |
169 次 |
| 最近记录: |