回答
在non-ARC下,99%的情况下你不应该重写发布方法。
我已经看到只有一种情况需要重写释放方法 - 一种单例,它强制类实际上有一个单一实例,无论你调用alloc多少次。
这样重写不仅release
方法,也allowWithZone:
,retain
,“retainCount`等(它实际上是不常见的实现那种单身的)
如果您不使用ARC,则应该覆盖-[MyObject dealloc]
dealloc方法以释放对象内的所有保留对象。我从来没有发现我需要重写发布方法的情况。
如果您使用的是ARC,通常可以避免重写-dealloc方法,除非您使用的ARC不会像sqlite指针或其他东西那样释放。
哪一个是最好的方法?覆盖
release
或dealloc
方法?
- dealloc
,绝对。你绝不应该重写- release
。
为什么?
一,因为release
做了一堆内部的东西。二,,因为如果release
被调用,它的确如此而不是意味着对象被解除分配。
所以你会释放你的ivars或无意中你的属性。当我们能够拥有世界和平时,谁想要一个丑陋的段落错误?
如果一个对象真的被释放,将会调用- dealloc
。
不依赖dealloc来处理与内存无关的任何事情。关闭插座 –
@ Daij-Djan嗯,我认为这取决于。对象实现封装,如果析构函数需要关闭套接字,那么它需要关闭该套接字... – 2012-11-26 22:20:06
是的,但运行时不能保证(弧可以优化时序)或者它被调用...例如当一个应用程序退出时......它实际上是我现在可以看到的唯一明智的理由 –
不覆盖或者任何东西不涉及到内存管理 - 你不知道什么时候这些方法甚至被调用。
例外当你要的dealloc:
- 删除KVO /通知中心观察员
- 重新分配手动分配的内存(ARC)/释放你的高德(非弧形)
“不要重写” - 我会高兴地检查你的应用程序的内存泄漏... – 2012-11-26 19:03:55
:P读取我的异常之前做出讽刺评论;)也许我重新格式化我的答案,虽然;) –
对不起,我没有注意你正在例外 - 我现在意识到你是对的。 – 2012-11-26 22:19:13
- 1. autorelease与释放dealloc
- 2. 在dealloc和/或release上释放/释放对象吗?
- 3. 我应该释放的dealloc
- 4. 不能释放NSFetchedResultsController在dealloc
- 5. 释放viewDidUnload和dealloc两者?
- 6. Java不释放finalize()覆盖的对象
- 7. 覆盖或覆盖
- 8. 覆盖保留/释放在ARC
- 9. Objective C:子类化,覆盖dealloc
- 10. 伊娃和财产释放dealloc
- 11. Objective-C阻止NSString被释放/ dealloc
- 12. 如何在-dealloc中正确释放CGMutablePathRef?
- 13. 在哪里释放一个对象? dealloc或ViewDidUNload
- 14. 类似的方法来覆盖保留和释放在Swift 1或2?
- 15. 围绕注释覆盖
- 16. 用反射覆盖注释?
- 17. orm.xml不会覆盖注释
- 18. 在dealloc中释放的ivars给“指针被释放没有分配”的错误
- 19. 释放被覆盖的数据的磁盘空间?
- 20. 线程内的UIImage未被释放/覆盖
- 21. 在我自己的类中覆盖保留和释放方法
- 22. 覆盖或重载?
- 23. 在UIView dealloc方法中,你是否会释放你的属性BEFORE或AFTER [super dealloc]?
- 24. 释放或自动释放的对象
- 25. 为什么窗口在应用中自动释放:didFinishLaunchingWithOptions:并在dealloc中释放?
- 26. dealloc中的属性:release然后设置为nil?或者简单地释放
- 27. 谷歌地图v3 PNG覆盖不释放内存时发布
- 28. 覆盖对象实例不释放内存?
- 29. 覆盖开放()在imaplib
- 30. Javassist覆盖现有的注释
不使用ARC,对吧? –