2011-11-04 68 views
0
@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方法吗?当包含这些对象的NSMutableArray被释放时,如何释放组合对象?

回答

4

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

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

这指向您的内存管理string伊娃是不正确的。您在-init(我在非常宽松的意义上使用“正确”)中正确占有零长度字符串的所有权,但每次释放对象时它都会释放该字符串。考虑:

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

上面很可能会崩溃(如果它不,你很倒霉)。当你的对象终于不再需要时,你应该释放字符串-dealloc。如果您更改伊娃提及的对象,您也必须更改所有权。

+0

嗨Thankz指出特殊情况。我从来没想过这点。但我的疑问是,当我们将TestClass对象添加到它的类型变为id的数组中时,我相信。所以当我们释放数组时,NSObject的释放方法被调用从而泄漏字符串,或者它会调用TestClass的释放方法。 – Aaron

+1

首先:这不是特例,它实际上是你在你的问题中记录的情况。它不会奇迹般地改变类型。面向对象编程的重点是对象指定自己的行为,所以如果你发送一个消息的对象,你会得到该对象的行为,没有其他。 – 2011-11-04 10:28:08

+0

对不起,我对脆弱的Base类问题感到困惑。 Thatz y我问.. – Aaron

3

千万不要覆写-release!你想重写的是-dealloc!并在那里你必须调用[super dealloc]

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

和你的问题,如果你的数组被释放,该阵列中的每个对象发送一个release消息。

+1

“如果您释放数组,数组中的每个对象都会发送释放消息。” - 这不一定是真的。看到我对Tudorizer的回答的评论。 –

+0

Thx,更新它。 – V1ru8

2

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

+2

“是的,释放NSMutableArray也会释放单个对象。”是不正确的。释放数组将释放单个对象。如果没有其他对象保留它,抛出数组只会导致释放。 –

+0

你说得对。我的错。我的意思是_deallocating_。 – Tudorizer

1

就像

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

将增加retainCount到的TestClass实例

所以会释放递减的所有对象的retainCount数组中

注意dealloc是在实施方法你自定义类,它会在您的对象被释放时调用。

+0

不真实。请参阅对所有其他已做出相同声明的答案的评论。 – 2011-11-04 09:57:21