![](/img/trans.png)
[英]Why should a self-implemented getter retain and autorelease the returned object?
[英][self retain], [self autorelease], is this correct when I'm assigned as a delegate?
我用一些听起来很奇怪的东西解决了崩溃:调用[self retain]和[self autorelease]。
这是案例:
MyObject是UIView的子类,因此通常将其分配,放在视图堆栈上并释放。 MyObject还有一个计时器,它将自己从superview中删除。 所以基本上MyObject可以随时解除分配。 除了显示酷的stuf之外,MyObject还能够显示UIAlertView,并等待用户的选择,因此它是alertView的委托。 问题是,如果用户在MyObject被释放后做出选择......那么你知道EXC_BAD_ACCESS我猜...
所以我可以保留对AlertViews的引用(是的,有几个),并在MyObject dealloc方法中将委托设置为nil。 但是我无法处理选择(因为有几个,它会产生更多变量实例,我不喜欢。
所以我做的是:
//alertView creation
-(void)showAlert{
[self retain];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"title"
message:@"message"
delegate:self
cancelButtonTitle:@"No"
otherButtonTitles:@"Yes",nil];
[alertView show];
[alertView release];
}
//Delegate method
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
[self autorelease];
// Do the job
}
我知道这不好,我已经围绕这个做了很多评论,以使其他开发人员能够重用代码时要小心,但我看不到另一种选择。 这是正确的吗 ? 有更好的方法吗?
请记住,委托模式,以避免具有循环依赖性,该循环依赖性阻止主对象以及委托被释放,因为它们都具有彼此的引用,这要求主对象不保留委托。 因此,如果您动态创建委托并将其分配给对象,则必须自行保留并自动释放!
坦率地说,你的程序结构都是粗糙的,这就是导致你麻烦的原因。 您应该将所有委托功能和管理视图的责任移动到单独的控制器对象中。
首先,我没有看到保留自己的问题。 我也在一些多线程代码中做过。 也许不是最好的解决方案,但它有效。
现在,如果你想避免[自我保留],请考虑以下事项:当计时器触发时,可能不会直接解除分配,而是检查是否存在警报。 如果没有,请释放。 如果是,则隐藏视图(但不要从superview中删除)并在新的ivar中设置一个标志,该对象应从superview中删除。 在工作表的回调中,检查标志,如果已设置,则从超视图中删除视图,然后释放它。
你不能让你的alertView
成为alertView
或实例变量,只需在MyObject的dealloc
设置alertView.delegste = nil
吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.