【问题标题】:Do I need to release the Objects in NSMutableArray? [duplicate]我需要释放 NSMutableArray 中的对象吗? [复制]
【发布时间】:2011-08-16 13:11:25
【问题描述】:

可能重复:
Cocoa Memory Management NSArray with Objects

我有一个 NSMutableArray 填充了一些对象。

例如:

...
id test = [NSObject new]; 
NSMutableArray *myArray = [NSMutableArray new];
[myArray addObject: test];
...

当多个对象需要对该数组的引用时,我不能只使用方法“--removeAllObjects”。 所以我只在我自己的类的“-dealloc”方法中使用释放数组。

- (void)dealloc {
    [myArray release];
    [super dealloc];
}

那么我的名为“test”的对象是否泄露了,因此我需要做更多的事情吗?

我在文档中找不到答案,NSMutableArray 的“dealloc”或“release”方法没有意义。在 NSObject 参考中,他们没有描述 NSMutableArray。 可能是“内存管理编程指南”中的任何地方(希望如此)。

【问题讨论】:

标签: iphone objective-c memory-management nsmutablearray


【解决方案1】:

容器将保留其包含的对象,并在容器被销毁或对象从其中删除时释放它们。将对象添加到容器后,您应该释放它们(因为它们被容器保留,因此您不再需要保留它们)。

【讨论】:

  • 我们的意思是:您应该在将对象添加到容器后释放它们,如果您拥有它们。因此,在提供的示例中(使用+new),您必须在将对象添加到容器后释放它。但是,如果您将对象的所有权转移到自动释放池(通过向对象发送-autorelease),则不能释放它。
【解决方案2】:

只释放你拥有的东西,无论是通过 alloc、new、retain 还是 copy。

你做完后自己的测试

id test = [NSObject new];

所以你有责任释放它,无论你是否将它添加到数组中。

如果你这样做

id test = [[NSObject new] autorelease]; // or any autoreleased convenience methods

你已经放弃了测试的所有权,所以你不应该释放它,即使你把它放在一个数组或其他形式的集合中。该集合将获得所有权。

你只需要释放你拥有的东西。

【讨论】:

    猜你喜欢
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    相关资源
    最近更新 更多