我需要在 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)