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

40

所以,我有一节课:

@interface Controller : NSObject
{
    UILabel* fileDescription;
}

@property(strong, nonatomic) UILabel* fileDescription;

我需要在属性fileDescription等于nil的时候使用dealloc方法吗?
例如:

-(void)dealloc
{
    fileDescription = nil;
}
如果不是这样,谁会释放fileDescription使用的内存?

回答标题:不需要,即使手动调用 alloc(就像许多库一样),我们启用了ARC的应用程序也没有一个dealloc调用(但有许多dealloc实现)。 回答意图是:需要dealloc特殊方法(也称为回调/钩子/事件/操作/处理程序)需要释放/释放动态资源(任何不由ARC管理的资源)。 - Top-Master
5个回答

81

通常情况下,由于ARC管理实例变量的生命周期,您不需要提供子类化的dealloc方法。

但是,除了释放对象之外进行其他清理,例如删除观察者或干净地关闭网络连接,可能是有用的。因此,在ARC下,您被允许子类化dealloc,但不允许在子类化方法中调用 [super dealloc]

在您的特定情况下,这是不必要的。


3
为什么[super dealloc]不被允许呢?即使它是放在最后的位置? - TonyTony
3
因为编译器会自动调用它。 - trojanfoe

9

不需要在ARC中使用dealloc方法。

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

例如:

您正在运行一个定时器来更新您的视图。当您关闭视图时,您需要停止该定时器。在这种情况下,您可以使用dealloc方法并在其中停止定时器。

对于NSNotification观察者也是类似的。


6
dealloc方法中停止一个计时器有点棘手,因为计时器会保留它的目标对象。因此,如果一个视图控制器使用target:self启动计时器,只要计时器正在运行,该控制器就不会被释放。(可参考https://dev59.com/8W3Xa4cB1Zd3GeqPgZYb#14490927) - Martin R
1
@MartinR:感谢您的评论 :) 以及宝贵的信息 :) - Midhun MP
@shim:不,你不能使用那些。提示:它将在视图从屏幕上消失时被调用。 - Midhun MP
@shim:好的,我说过了dismiss这个视图,如果你从那个视图呈现一个视图控制器会发生什么?它也会触发你上面提到的方法。 - Midhun MP
@shim:我为什么要这样做?在这种情况下,使用dealloc方法要比使用isMovingFromParentViewController好得多。 - Midhun MP
显示剩余6条评论

6
如果您正在使用自动引用计数(ARC)。
无需使用dealloc和release,编译器知道您的属性和对象是强引用或弱引用,因此它会进行管理。
编辑:
如果您使用核心框架对象如CG...和CF...,则需要使用dealloc方法。即使您为通知创建观察者,也需要将其删除,并且dealloc是最好的地方来removeObserver。

0

答案是否定的,因为使用ARC不需要手动释放。


3
这个答案太笼统了。它给人的感觉是永远没有理由调用dealloc方法(有时候是有的,正如其他答案中所指出的那样)。 - borrrden

0

由于您正在使用ARC,因此不必使用dealloc。编译器将根据属性、变量或控件的范围设置自动释放池,并且它将release内存。通常我们可以将不同类型的自动释放池定义为函数级别、类级别等等。希望这可以帮助到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接