我已经在程序中创建了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
答案 0 :(得分:2)
如果要释放作为其他对象委托的对象,则需要确保在调用[super dealloc]
之前已将其委托设置为nil(假设对象未保留的正常模式)他们的代表)。这是因为当[super dealloc]
返回时,如果它们尚未设置为nil,则此对象不再是有效对象,而且它是有效拥有悬空引用的委托对象。
在这种特殊情况下,您可能会在没有这样做的情况下离开,因为除非正在拆除UI并且表视图不再需要使用其委托或数据源,否则可能无法调用对象的dealloc。打赌它。
答案 1 :(得分:1)
来自Setting delegate to nil in dealloc:
这是一个防御性的编程举措。它正在清除对委托对象的引用,因为在您告诉它已完成委托之后,对象中的其他内容会尝试访问该委托。作为dealloc的一部分,您可能有一个方法或执行某些操作来触发调用委托的KVO通知。因此,将委托的引用设置为nil可以防止发生这种情况。如果确实发生了这种情况,你可能会遇到一些奇怪的崩溃,这些崩溃很有趣,可以重现和修复。
答案 2 :(得分:0)
要添加上述答案,您不需要
table = nil;
在你的dealloc中。它不会受到伤害,但没有必要把你的伊娃扔掉。您的视图正在被解除密切,因此您的ivars将无法访问。你可能会混淆:
self.table = nil;
如果您通过财产访问ivar,它可以作为另一种释放方式。
当然,如果你打开ARC,那么根本不需要发布。
要回答你的实际问题,如果你没有在视图的dealloc上删除表的委托和数据源......什么都不会发生。它们被设置为视图,该视图正在被释放。在这种情况下,你没有问题没有做到这一点。从理论上讲,这是一种很好的形式。