Objective-C NSMutableArray释放行为

4

释放对象时,是否会递归释放所有内部对象?还是必须手动完成?

我只需要这样做吗?

NSMutableArray *list = [[NSArray alloc] init];
// ...
// fill list with elements
//...
[list release];

在释放NSMutableArray之前,我是否必须逐个释放所有内部对象?//假设除了列表本身之外,没有任何对包含对象的其他引用。


我删除了2011年2月的答案,因为其中包含不正确的信息。在其中,我声明需要使用[x removeAllObjects]来确保所包含的对象被释放。这有点正确:如果您使用[[NSMutableArray alloc] init]创建NSMutableArray,则肯定不是真的。但是,当您完成它时,为了确保自动释放的NSMutableArray中包含的对象被删除并发送释放消息,而不是在数组最终由池释放时才释放,它确实适用。除了天真之外,让我困惑的是上面的代码实际上将NSArray强制转换为NSMutableArray。 - unsynchronized
2个回答

4

是的,它确实会保留这些值并在释放时释放它们。这实际上是我在这里看到的最常见的问题之一。


我刚开始学习Objective-C,谢谢 :) - fmsf

0

如果您拥有该对象,则必须释放它。

    NSMutableArray *list = [[NSArray alloc] init];

    NSString *str = [[NSString alloc] init] // you are the owner of this object
    [list addObject:str];
    [str release]; // release the object after using it
    [list release];

如果您不是该对象的所有者,则不应释放。

    NSMutableArray *list = [[NSArray alloc] init];

    NSString *str = [NSString string]; // you are not owning this object
    [list addObject:str]; // str retain count is incremented
    [list release];  // str retain count is decremented.

这是一个概念,即数组也使用。当您将任何对象添加到数组中时,数组将保留它。从某种意义上说,它成为该对象的所有者,并且当您释放数组时,它将释放该对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接