重写objective-c中的dealoc方法

重写objective-c中的dealoc方法,objective-c,dealloc,Objective C,Dealloc,有人能告诉我,如果在Objective-C中重写dealloc方法,实际会发生什么情况吗?它会崩溃还是开始到处泄漏内存。我一直想知道会发生什么,为什么有必要阻止程序员直接使用dealloc 在什么情况下你会做这样的事情 编辑:抱歉,各位不清楚。我主要讲的是术语或ARC类型编码。重写-dealoc在非ARC代码中是非常常见的事情。事实上,您很难找到一个不重写它的类 但是,要记住的关键是,对-dealoc的每一次重写总是以调用[super dealoc]结束 当然,在ARC代码中,重写-deallo

有人能告诉我,如果在Objective-C中重写dealloc方法,实际会发生什么情况吗?它会崩溃还是开始到处泄漏内存。我一直想知道会发生什么,为什么有必要阻止程序员直接使用dealloc

在什么情况下你会做这样的事情


编辑:抱歉,各位不清楚。我主要讲的是术语或ARC类型编码。

重写
-dealoc
在非ARC代码中是非常常见的事情。事实上,您很难找到一个不重写它的类

但是,要记住的关键是,对
-dealoc
的每一次重写总是以调用
[super dealoc]
结束


当然,在ARC代码中,重写
-dealloc
的情况要少得多。如果您确实重写了它,您就不会调用
[super dealoc]
,因为编译器会为您插入它。但是请记住,这仅在ARC下才是正确的。

在ARC覆盖
dealloc
方法之前,您是在释放被释放实例所拥有的IVAR。现在,使用ARC不太常见,但是,在某些特殊情况下,您可能必须这样做,例如,当您使用
NSNotificationCenter
从观察中取消注册实例时

您谈到的规则是不要直接调用
dealloc
(而不是重写),这通常会导致崩溃,因为您绕过了Cocoa的内部引用计数系统


编辑:根据您的编辑,如果在ARC下调用
[super dealloc]
,您将得到一个编译时错误。如果没有错误,可能会导致重复调用
dealloc
,这会导致程序崩溃。

如果使用ARC,通常不会这样做。如果你不使用ARC,你会用它来释放你所保留的东西。我会看一看苹果公司的报告,以便更熟悉这一点。谢谢你提供的信息,但我没有接受这个答案,因为它没有完全回答我关于会发生什么的问题,而不是关于它的问题+1@nlee918当前位置瓦伦丁也没有告诉你。当我说这是一件很平常的事,也就是“没什么不好”时,我认为答案是非常含蓄的。我所看到的只是瓦伦丁关于从不直接调用
-dealoc
的评论。这就是你想问的吗?因为这不在你的问题中,而且它实际上与覆盖
-dealoc
@KevinBallard没有关系好吧,我确实告诉了他,但在阅读完整答案时有一点困惑。在编辑中,我回答了他的编辑,这可能就是nlee918得到它的原因。我在上一段谈到直接电话时,你被弄糊涂了。我的错误。为了更清楚,我进行了编辑。我很确定您给出的示例——从DealLocal中的NSNotificationCenter注销——不起作用,因为
您必须在addObserverForName:object:queue:usingBlock:指定的任何对象被释放之前调用removeObserver:或removeObserver:name:object:。
将其删除。我弄错了。很好,+1