我需要在 ARC 中使用 dealloc 方法吗?

Posted

技术标签:

【中文标题】我需要在 ARC 中使用 dealloc 方法吗?【英文标题】:Do I need use dealloc method with ARC? 【发布时间】:2013-01-24 12:13:48 【问题描述】:

所以,我有课:

@interface Controller : NSObject

    UILabel* fileDescription;


@property(strong, nonatomic) UILabel* fileDescription;

我是否需要在属性 fileDescription 等于 nil 的情况下使用方法 dealloc? 例如:

-(void)dealloc

    fileDescription = nil;

如果不是,谁将关闭 fileDescription 使用的内存?

【问题讨论】:

回答标题:No,即使手动调用alloc(像许多库一样),我们启用ARC 的应用程序也没有一个dealloc 调用(但有许多dealloc 实现)。 回答什么意思:Yes,需要dealloc 特殊方法(又名回调/挂钩/事件/动作/处理程序)来释放/释放动态资源(任何不由ARC). 【参考方案1】:

通常您不需要提供子类dealloc 方法,因为 ARC 管理实例变量的生命周期。

但是,执行清理而不是释放对象可能很有用,例如删除观察者或彻底关闭网络连接。因此,您可以在 ARC 下对 dealloc 进行子类化,但不允许在子类化方法中调用 [super dealloc]

但是,在您的特定情况下,它不是必需的。

【讨论】:

只是想知道为什么不允许使用[super dealloc]。就算是在最后? @TonyTony 因为编译器会自动调用它。【参考方案2】:

没有。

ARC 中不需要 dealloc 方法。

但是,如果您想在视图关闭或释放时执行一些清理任务。这是最好的地方,在这种情况下你可以实现它。

例如:

您正在视图中运行一个计时器,它正在更新您的视图。当您被解雇时,您需要停止该计时器。在这种情况下,您可以使用 dealloc 方法并在那里停止计时器。

NSNotification 观察者类似。

【讨论】:

dealloc 中停止计时器有点棘手,因为计时器会保留它们的目标。所以如果一个视图控制器用target:self启动一个定时器,只要定时器在运行,它就不会被释放。 (比较***.com/questions/14490178/…) @MartinR:感谢您的评论 :) 以及宝贵的信息 :) 应该只使用viewDidDisappear,或者viewWillDisappear @shim:不,你不能使用这些,提示:每次视图从屏幕上消失时都会调用它。 对于 Midhun MP 给出的在关闭视图时停用计时器的示例,我不明白为什么不这样做。【参考方案3】:

如果您使用的是 ARC。

不需要使用dealloc和release,编译器知道你的属性和对象是强/弱的,所以它会管理它。

编辑:

如果你使用像CG... & CF... 这样的核心框架对象,则需要dealloc 方法。即使您为需要删除它的通知创建观察者,dealloc 也是删除观察者的最佳位置。

【讨论】:

【参考方案4】:

Ans 是 NO,因为有了 ARC 就不需要解除分配。

【讨论】:

这个答案太笼统了。听起来从来没有理由调用 dealloc 方法(有时有,如其他答案所述)。【参考方案5】:

当您使用 ARC 时,您不必使用 dealloc Complier 将根据属性、变量或控件的范围设置 autoreleasePool。它会release 内存。有不同类型的自动释放池,通常我们可以将它们定义为函数级别、类级别等。希望这会有所帮助。

【讨论】:

以上是关于我需要在 ARC 中使用 dealloc 方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

UIViewController 在 dealloc 时不释放子视图(使用 ARC)

iOS 在 ARC 环境下 dealloc 的使用理解误区

控制器pop时没有被销毁(没有走dealloc方法)错误原因

weak属性需要在dealloc中置nil么?

我应该在 dealloc 中释放实例变量和属性吗?

使用 dealloc 的小代码中的内存泄漏