@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方法?
答案 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
是在自定义类中实现的方法,在释放对象时会调用它。