dealloc和发布问题

时间:2011-09-15 14:09:38

标签: objective-c

我知道此问题之前曾多次讨论,但我有一个简单的问题。 在阅读完所有管理记忆的苹果规则后,我知道:

如果我分配一个对象,我拥有它并且必须释放它。所以我必须这样做:

ran *me = [[ran alloc] init];
//do somthing
[me release];

现在,在我发布了run object之后,保留计数为0。

但我还读到,当一个对象的保留计数为0时,正在调用dealloc方法。

所以我的问题是,在我将保留计数降为0之后,我是否必须再次释放dealloc中的对象?

-(void)dealloc
[me release];

或第一个版本完成了这项工作? 否则,为什么dealloc被调用呢?如果保留计数= 0,我们没有问题吗?

非常感谢。

3 个答案:

答案 0 :(得分:1)

不,你不需要在那里再次释放 - 事实上,不要这样做!

调用dealloc的原因是可能发生清理。例如,如果您在班级中分配了内存,则可以将其释放。请记住,保留计数可以达到2,3,4,5 ....所以只是因为release已经完成,你不会(作为类的外部用户)知道dealloc应该是调用。这就是它与发行版的不同之处。

需要注意的一点是,当计数达到0时,dealloc方法可能不会立即运行。可以在以后完成。

答案 1 :(得分:1)

取决于变量“me”是实例变量,还是“ivar”,因为它被调用。

对于ivars,你将释放放在dealloc中。对于其他一切,您必须使用您创建它的相同方法释放它。

除非它是一个自动释放的对象,但这是一个不同的故事......

答案 2 :(得分:0)

首先我认为你的意思是[我发布];

其次你只能在dealloc中释放它,如果你把它保存在.h文件中就好了 @property(nonatomic,retain)ran * me;

通过这个你将* me的retaincout设置为1然后将init分配给.m文件中的2,然后你必须释放* me两次。第一次用于alloc init,第二次用dealloc表示保留在.h

希望这有帮助。