我知道此问题之前曾多次讨论,但我有一个简单的问题。 在阅读完所有管理记忆的苹果规则后,我知道:
如果我分配一个对象,我拥有它并且必须释放它。所以我必须这样做:
ran *me = [[ran alloc] init];
//do somthing
[me release];
现在,在我发布了run object之后,保留计数为0。
但我还读到,当一个对象的保留计数为0时,正在调用dealloc方法。
所以我的问题是,在我将保留计数降为0之后,我是否必须再次释放dealloc中的对象?
-(void)dealloc
[me release];
或第一个版本完成了这项工作? 否则,为什么dealloc被调用呢?如果保留计数= 0,我们没有问题吗?
非常感谢。
答案 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
希望这有帮助。