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