Iphone [self-retain],[self-autorelease],当我';我被指派为代表?

Iphone [self-retain],[self-autorelease],当我';我被指派为代表?,iphone,objective-c,memory-management,Iphone,Objective C,Memory Management,我用一种听起来很奇怪的方法解决了一次崩溃:调用[self-retain]和[self-autorelease] 情况是这样的: MyObject是UIView的一个子类,所以它通常被分配、放在视图堆栈上,然后被释放。MyObject还有一个计时器,它将从superview中删除自身。所以基本上MyObject可以在任何时候解除分配。 除了显示酷stuf,MyObject还可以显示UIAlertView,并等待用户的选择,因此它是alertView的代理。 问题是,如果用户在MyObject解除分

我用一种听起来很奇怪的方法解决了一次崩溃:调用[self-retain]和[self-autorelease]

情况是这样的:

MyObject是UIView的一个子类,所以它通常被分配、放在视图堆栈上,然后被释放。MyObject还有一个计时器,它将从superview中删除自身。所以基本上MyObject可以在任何时候解除分配。 除了显示酷stuf,MyObject还可以显示UIAlertView,并等待用户的选择,因此它是alertView的代理。 问题是,如果用户在MyObject解除分配后做出选择。。。好吧,你知道的,我想,EXC_糟糕的访问

因此,我可以保留对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
}

我知道这不好,我已经在这方面做了很多评论,以使其他将重用代码的开发人员更加小心,但我看不到其他选项。它正确吗?有更好的方法吗?

请记住,委托模式,以避免循环依赖性阻止主对象和委托rom被释放,因为它们彼此都有引用,要求主对象不保留委托。因此,如果您动态创建委托并将其分配给对象,您必须自己保留并自动释放它!

首先,我不认为保留自己有问题。我也在一些多维数据库中这样做了-线程化代码。也许不是最好的解决方案,但它确实有效

现在,如果你想避免[自我保留],请考虑以下内容:
也许当计时器触发时,您可以检查是否出现警报,而不是直接取消分配。如果没有,则释放警报。如果是,则隐藏视图(但不要从superview中删除)并在新的ivar中设置一个标志,表示应该从superview中删除该对象。在工作表的回调中,检查该标志,如果设置了该标志,则从superview中删除该视图,并将其释放。

坦率地说,您的程序结构非常粗糙,这正是造成您的问题的原因。您应该移动所有代理功能和职责用于将视图管理为单独的控制器对象。

您不能将您的
alertView
设置为@属性或实例变量,然后在MyObject的
dealloc
中设置
alertView.delegste=nil

我可以,但我无法处理用户选择的信息我正在处理的对象是libra我们提供给客户的ry,因此客户也可以将其从superview中删除。虽然这是一个好主意,但这会使我们的客户执行此操作变得太复杂。