gpt4 book ai didi

iphone - 在 Objective-C/Cocoa 中,多个对象可以保留同一个对象吗?

转载 作者:太空狗 更新时间:2023-10-30 03:40:58 25 4
gpt4 key购买 nike

假设我有一个列出 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 并释放了本地副本?还是我错过了保留电话?

然后,如果用户在表中选择一个特定的行,并且我想显示一个详细的 Foo View ,我将调用:

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;

对比保持。但有时会使用不在数组中的 Foo 调用 FooView 类。所以我想确保让两个对象捕获同一个对象是可以的。

最佳答案

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

基本上,发送 -retain 消息表示发送方“拥有”接收方,因为在所有所有者释放其所有权之前,接收方不应被释放.因此,个别实例不需要知道(也不应该关心)其他所有者是否存在。保留任何你需要随身携带的东西,用完后放开它。当所有所有者都释放了他们的所有权时,一个实例就可以被解除分配。

旁注,

@property (retain,readwrite) NSMutableArray *myArray;

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

关于iphone - 在 Objective-C/Cocoa 中,多个对象可以保留同一个对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2715507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com