【发布时间】:2010-01-20 23:52:38
【问题描述】:
如果你学会了如果委托的生命周期比对象短,你应该从对象中删除委托。但是,如果您不再引用该对象,该怎么做呢?
在我的 iPhone 应用程序中,我有一个视图控制器 vc,它执行异步活动并显示为模式视图。取消按钮关闭模式视图。如果发生错误,则会显示 UIAlertView alert。如果用户点击 ok,alert 和模态视图都会消失。因此设置了vc
作为alert 的代表并实现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];
}
}
通常,警报视图会阻止所有输入。不幸的是,它在某些边缘情况下无法做到这一点。
如果用户在警报视图出现之前按下取消按钮,并在警报视图出现后触摸取消按钮,则视图将被关闭,但警报不会。 vc 被释放,如果用户在警报上点击“确定”,应用程序将崩溃,因为一条消息被发送到释放的对象。
我通过将alert 分配给vc 的属性解决了这个问题,因此我可以在dealloc 中将alert.delegate 设置为nil。我发现这个解决方案不是很优雅,因为我真的不需要对 alert 的引用。
有更好的方法吗?
编辑:添加了斜体中的文本作为说明
【问题讨论】:
标签: iphone objective-c delegates