繁体   English   中英

在dealloc方法中,需要将任何委托设置为nil

[英]In dealloc method set any delegate to nil is needed or not needed

我已经通过如下的程序化在视图中创建了tableview

table = [[UITableView alloc] initWithFrame:CGRectMake(0, 44, 320, 370) style:UITableViewCellStyleDefault];
table.delegate = self;
table.dataSource = self;
table.separatorStyle = UITableViewCellSeparatorStyleNone;
[self.view addSubview:table]; 

在dealloc方法中我写如下

table.delegate = nil;
 table.dataSource = nil;
[table release];
table=nil;

这是更好的方法或低于一个更好

[table release];
table=nil;

我想知道我是否不重置委托和dataSource会发生什么

Thanq

如果要取消分配充当其他对象的委托的对象,则需要确保在调用[super dealloc]之前将其委托设置为nil(假定对象不保留其委托的正常模式)。 这是因为当[super dealloc]返回时,该对象不再是有效对象,并且如果未将其设置为nil,则该对象将成为有效悬挂参数的委托。

在这种情况下,您可能会不做而离开,因为除非拆除UI且表视图不再需要使用其委托或数据源,否则您的对象的dealloc可能不会被调用,但是不要打赌在上面。

在dealloc中将委托设置为nil

这是一种防御性的编程动作。 如果您告诉对象已使用完委托后,对象中的其他内容试图访问委托,则会清除对委托对象的引用。 作为您的dealloc的一部分,您可能有一个方法或执行某些操作来触发KVO通知,该通知会调用该委托。 因此,将委托人的引用设置为nil可以防止这种情况的发生。 如果确实发生了,您可能会遇到一些奇怪的崩溃,很有趣,可以重制和修复。

要添加到上面的答案,您不需要

table = nil;

在你的dealloc中。 不会造成伤害,但是没有必要消除您的错误。 您的视图正在取消分配,因此您的ivars将不再可用。 您可能将其与:

self.table = nil;

如果您通过属性访问ivar,则可以用作释放的另一种方法。

当然,如果您已打开ARC,则根本不需要该版本。

并回答您的实际问题,如果您不取消视图的dealloc上的表的委托和数据源,则...什么都不会发生。 它们被设置为视图,该视图正在被释放。 在这种情况下,您将不会有任何问题。 从理论上讲,这是一种很好的形式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM