我有两个问题。
1)其中哪一个会释放ob?
- (void){
ClassOne *ob = [[ClassOne alloc] init]; // should I use autorelease here?
self.O = ob;
[ob release]; // is this correct ??
}
或
-(void)dealloc{
[O release]; // is this correct?
}
2)有两个类ClassOne
和ClassTwo
。 ClassTwo
中的方法是:
- (void) takeParam:(ClassOne *pt) {
// something going here
}
并且在第三类中有方法
- (void) runIt {
ClassOne *ob = [[ClassOne alloc] init];
[classTwoOb takeParam:ob];
}
我应该在哪里调用ClassOne
对象的发布?
答案 0 :(得分:3)
-release
方法仅减少相关对象的保留计数。当保留计数达到零时,运行时将调用-dealloc
。
如果您发送alloc
,copy
或retain
消息,则必须稍后致电release
或autorelease
。
有关详细信息,请参阅this excellent answer。
答案 1 :(得分:2)
1号可能是正确的。
ClassOne *ob = [[ClassOne alloc] init]; // do i should use autorelease here ?
当你致电[ClassOne alloc]
时,你会得到一个保留计数为1的对象,你负责释放。
self.O = ob;
假设self.O
是retain
属性,而不是assign
属性,self.O
/ ob
的保留计数为2.
[ob release];
现在self.O
/ ob
的保留计数为1.此release
与alloc
匹配。剩余的保留计数归self
所有,因此您必须记得在O
完成后才发布self
。
-(void)dealloc{
[O release]; // is this correct ??
}
好。你记得发布O
。现在O
将在self
被解除分配时完全释放。 (注意:您应在[super dealloc]
结束时致电dealloc
。)
- (void) runIt {
ClassOne *ob = [[ClassOne alloc] init];
[classTwoOb takeParam:ob];
}
您应在致电ob
后发布takeParam:
。方法负责保留他们想要保留的对象。如果takeParam:
将ob
存储在classTwoOb
上,则应在方法返回之前将其保留。如果没有,它不应该。
在返回已创建对象的方法中使用autorelease
。这使得调用者有机会在需要时保留该对象,如果不长时间则不需要它。例外情况是用于创建对象的方法,应始终将其称为alloc
,new
或*copy*
,并应返回带有引用的对象计数为1,使调用者负责释放。
要真正学习Objective-C内存管理,我建议您阅读“内存管理编程指南”,尤其是Memory Management Rules部分。