我将UIAlertView
包装在常规NSObject
中以允许完成处理程序块而不是委托模式。
问题是我分配了我的对象的本地实例,它在内部创建了一个UIAlertView
并将其委托分配给对象本身。当显示警报并且用户点击按钮时,应用程序会崩溃EXC_BAD_ACCESS
,因为ARC已释放我的对象,并且警报的代表是 对象。
我怎么能处理这种情况?我看到一个解决方案是使用__block
限定局部变量并在完成块内使用对象本身,但这不起作用。
顺便说一句,如果我将'UIalertView'子类化而不是包装它,它可以工作,但文档说不建议使用警报子类,所以我更愿意解决这个问题。
答案 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,否则您将有一个保留周期。