gpt4 book ai didi

iphone - 从未引用的对象中删除 dealloc 上的委托(delegate)

转载 作者:行者123 更新时间:2023-12-03 20:59:33 25 4
gpt4 key购买 nike

如果通过惨痛的教训得知,如果委托(delegate)的生命周期比对象短,则应该从对象中删除委托(delegate)。但是,如果您不再拥有对该对象的引用,该怎么做呢?

在我的 iPhone 应用程序中,我有一个 View Controller vc,它执行异步事件并显示为模态视图。取消按钮会关闭模态视图。如果发生错误,则会显示 UIAlertView alert。如果用户点击“确定”,alert 和模态视图都会消失。因此vc被设置作为 alert 的委托(delegate)并实现 alertView:didDismissWithButtonIndex:。像这样的事情:

// UIViewController vc
...
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Error"
message:@"Something went wrong"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
self.alertView = alert; // needed to unset alertView.delegate in dealloc
[alert show];
[alert release];
...
}

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
[self dismissModalViewControllerAnimated:YES];
}
}

通常,警报 View 会阻止所有输入。不幸的是,在某些边缘情况下它无法做到这一点。如果用户在警报 View 出现之前触摸取消按钮,并在警报 View 出现之后触摸取消按钮,则 View 将被关闭,但警报不会被关闭。 vc 被释放,如果用户随后点击警报上的“确定”,应用程序将崩溃,因为消息已发送到已释放的对象。

我通过将 alert 分配给 vc 的属性解决了这个问题,这样我就可以在 dealloc 中将 alert.delegate 设置为 nil。我发现这个解决方案不是很优雅,因为我真的不需要警报的引用。

有更好的方法吗?

编辑:添加了斜体文本作为说明

最佳答案

尽管如此,通常会在未更改的内容上显示警报 View 。因此,如果委托(delegate)在 View 出现时处于事件状态,那么在 View 被关闭时它也可能处于事件状态。如果情况并非如此,您必须完全按照您所做的操作,如果您不再关心它的结果,则手动取消设置警报 View 的委托(delegate)。

所以你确实关心alertview,因为你关心它的委托(delegate)方法。问题是,在警报解除时,委托(delegate)可能还没有提出申请。因此,您需要那里的逻辑,并且对于该逻辑,您需要保存对相关警报 View 的引用。

换句话说,你做得对。虽然,如果 UIAlertView 保留其委托(delegate)可能会有所帮助,但如果它在关闭时崩溃,则似乎不会有帮助。

最后,我认为警报 View 阻止了所有屏幕输入?如果不是,您可以通过在警报出现时设置 vc.view.userInteractionEnabled = NO 使其成为真正的模式,并在警报消失时将其切换回来。这样,当警报 View 打开时,用户无法关闭 Controller 。这对我来说听起来更理智一些。

关于iphone - 从未引用的对象中删除 dealloc 上的委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2105958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com