ARC在调用完成处理程序块之前释放我的对象

时间:2013-01-28 13:38:47

标签: ios automatic-ref-counting block

我将UIAlertView包装在常规NSObject中以允许完成处理程序块而不是委托模式。

问题是我分配了我的对象的本地实例,它在内部创建了一个UIAlertView并将其委托分配给对象本身。当显示警报并且用户点击按钮时,应用程序会崩溃EXC_BAD_ACCESS,因为ARC已释放我的对象,并且警报的代表是 对象。

我怎么能处理这种情况?我看到一个解决方案是使用__block限定局部变量并在完成块内使用对象本身,但这不起作用。

顺便说一句,如果我将'UIalertView'子类化而不是包装它,它可以工作,但文档说不建议使用警报子类,所以我更愿意解决这个问题。

1 个答案:

答案 0 :(得分:2)

您可以将对象与警报视图关联起来,如下所示:

#import <objc/runtime.h>

...

- (void)showAlertView
{
    UIAlertView *alertView = [[UIAlertView alloc] initWithWhatever:...];        
    objc_setAssociatedObject(alertView, _cmd, self, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    [alertView show];
}

这将保留您的对象,然后在取消分配alertView时再次释放它。您的对象不得保留alertView,否则您将有一个保留周期。

相关问题