释放包含这些对象的NSMutableArray时如何释放复合对象?

时间:2011-11-04 09:46:55

标签: iphone objective-c nsmutablearray

@implementation TestClass

- (id) init
{
    string = [[NSString alloc] init];
    return self;
}

- (void) release
{
    [string release];
}

@end



@implementation MainScreen

- (void) addItems
{
    [myMutableArray addObject:[[[TestClass alloc] init] autorelease]];
}

- (void) release
{
    [myMutableArray release];
}

我的问题是,当我们发布myMutableArray时,它是否会调用TestClass的release方法?

4 个答案:

答案 0 :(得分:4)

不,这不是Cocoa内存管理的工作方式。将对象添加到数组时,数组通过发送-retain消息表示它拥有该对象。数组保持这种所有权,直到它本身消失(即被解除分配),然后它不再需要该对象并发送它-release以放弃所有权。每次保留或释放对象时,数组都不需要保留或释放对象。

总结:对象在需要拥有对象时保留其他对象,并在不再需要所有权时释放它们。

这表明您的string ivar的内存管理不正确。你正确地获取-init中的零长度字符串的所有权(我在非常宽松的意义上使用“正确”),但是每次释放对象时它都释放字符串。考虑:

TestClass *obj = [[TestClass alloc] init];
[obj retain];
[obj release];
[obj release];

以上可能会崩溃(如果没有,那你很不走运)。当你的对象最终不再需要它时,你应该在-dealloc中释放字符串。如果更改ivar引用的对象,则还必须更改所有权。

答案 1 :(得分:3)

绝不会覆盖-release!你要覆盖的是-dealloc!在那里你必须致电[super dealloc]

请阅读http://developer.apple.com/library/mac/documentation/cocoa/conceptual/memorymgmt/MemoryMgmt.pdf

对于你的问题,如果你的数组被解除分配,那么数组中的每个对象都会发送一条release消息。

答案 2 :(得分:2)

你应该覆盖 - (void)dealloc方法,而不是 - (void)release one;并且总是在最后调用[super dealloc]。 是的,发布NSMutableArray也会释放单个对象。

答案 3 :(得分:1)

就像

一样
[myMutableArray addObject:[[[TestClass alloc] init] autorelease]];

会将retainCount增加到TestClass实例

因此将释放减少数组中所有对象的retainCount

请注意,dealloc是在自定义类中实现的方法,在释放对象时会调用它。