1

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

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

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

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

4

1 回答 1

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,否则您将有一个保留周期。

于 2013-01-28T13:44:59.523 回答