2010-09-29 89 views
1

Objective-C中的对象是自杀的好习惯吗?也就是说,对于要宣布[self dealloc]的对象,其中-dealloc允许像往常一样有序放风?主要风险是什么?自杀:Objective-C对象自己调用自己的-dealloc方法

碰巧我有一个具体的例子,一个扩展NSObject的定制定时器对象,它包含一个NSTimer实例和一个设置为限制定时器激发次数的NSUInteger。当时间到了,对象告诉计时器到-invalidate,然后通过调用-dealloc方法自杀。因为这是自动的,所以我们不必担心必须跟踪对象或者关键地知道什么时候是正确的时刻来释放它。

如需更详细的解释,请参阅我的文章here

回答

8

Objective-C中的对象是自杀的好习惯吗?也就是说,对于一个对象声明[self dealloc],其中-dealloc允许像往常一样有序地放风?主要风险是什么?

只有一次号你曾经写信给dealloc的呼叫要发送的dealloc到超级对象的类之一的dealloc方法。没有例外。

如果您尝试在任何其他时间将dealloc发送给某个对象,则可能会让其他对象留下悬挂指针。不要这样做。


你是否应该将自我释放?这是另一回事,但你仍然应该遵循Memory Management Rules。如果您已将保留发送给自己,那么在某些时候您需要将发布发送给自己。有一个例外是在init中,如果初始化失败,你必须释放self并返回nil(我猜你可以声称alloc已经发送retain给self)。

+0

另一个建议(来自朋友)是使用' - (void)didFinishCounting'这样的方法制作一个包装。 – SK9 2010-09-29 23:01:14

9

你不应该调用-dealloc。而是调用[self release],以便引用计数变为0并让系统调用-dealloc。