iPhone SDK:Dealloc 与 Release?

Posted

技术标签:

【中文标题】iPhone SDK:Dealloc 与 Release?【英文标题】:iPhone SDK: Dealloc vs. Release? 【发布时间】:2009-11-05 18:31:15 【问题描述】:

我想知道 release 和 dealloc 之间有什么区别?在阅读了内存管理规则(见下文)之后,我在想大部分时间我将使用释放。但是,我想知道如何处理属性。

@property(保留)....

我一直在使用 dealloc,但在阅读了这篇文章后我不确定它是否正确。

如果您使用名称以“alloc”或“new”开头或包含“copy”的方法(例如,alloc、newObject 或 mutableCopy)创建对象,或者向其发送保留消息。您有责任放弃使用 release 或 autorelease 拥有的对象的所有权。任何其他时间您收到物品时,都不得释放它。

【问题讨论】:

【参考方案1】:

除了super 之外,您绝不应该致电dealloc

您将调用dealloc 的唯一时间是在自定义继承对象的dealloc 方法中,它将是[super dealloc]

当一个对象的retain count降为零时,dealloc会自动为你调用,所以为了正确管理内存,你需要在适当的时候调用retainrelease

如果您不清楚这一点,或者您想了解有关 Cocoa 中如何管理内存的详细信息,您应该阅读Memory Management Programing Guide。

【讨论】:

【参考方案2】:

你永远不会直接调用 dealloc。当对象的 retainCount 变为 0 时,系统会调用它。每次执行 retain 时,retainCount 都会增加 1 . 每次你执行release,它都会减少。这样,通过平衡您的 retainsreleases,您可以确保当 retainCount 为 0 时,dealloc 将被自动调用,并且你的对象被释放。

正如 Ben S 所说,您调用 dealloc 的唯一时间和地点是在继承对象的 dealloc 方法中。

【讨论】:

【参考方案3】:

使用@property(retain)@synthesize生成属性代码时,不需要对属性进行任何手动内存管理。其他答案是正确的,因为您不应该使用dealloc,除非您自己覆盖父类dealloc

【讨论】:

以上是关于iPhone SDK:Dealloc 与 Release?的主要内容,如果未能解决你的问题,请参考以下文章

Iphone:定制的 UIView 是不是需要 dealloc

iPhone - dealloc - Release vs. nil

Cocos2d-iphone,替换场景时不调用dealloc

iPhone 内存释放问题

MAP 与 iPhone 3.0 SDK 一起使用都有哪些限制?

UIPopoverController:在popover仍然可见时达到了dealloc