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

Ios ARC在调用完成处理程序块之前释放我的对象,ios,automatic-ref-counting,block,Ios,Automatic Ref Counting,Block,我将UIAlertView包装在常规的NSObject中,以允许完成处理程序块而不是委托模式 问题是我分配了一个对象的本地实例,该实例在内部创建了一个UIAlertView,并将其委托分配给对象本身。当显示警报且用户点击按钮时,应用程序会因EXC\u BAD\u访问而崩溃,因为ARC已释放我的对象,并且警报的代理是该对象 我如何处理这种情况?我看到一个解决方案是用\uu block限定局部变量,并在完成块中使用对象本身,但这不起作用 顺便说一句,如果我将“UIalertView”子类化而不是将其

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

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

我如何处理这种情况?我看到一个解决方案是用
\uu block
限定局部变量,并在完成块中使用对象本身,但这不起作用


顺便说一句,如果我将“UIalertView”子类化而不是将其包装,它会起作用,但文档说明不建议使用警报子类化,因此我更愿意解决此问题。

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

#import <objc/runtime.h>

...

- (void)showAlertView
{
    UIAlertView *alertView = [[UIAlertView alloc] initWithWhatever:...];        
    objc_setAssociatedObject(alertView, _cmd, self, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    [alertView show];
}
#导入
...
-(无效)showAlertView
{
UIAlertView*alertView=[[UIAlertView alloc]initWithWhather:…];
objc_setAssociatedObject(alertView、_cmd、self、objc_ASSOCIATION_RETAIN_NONATOMIC);
[警报视图显示];
}
这将保留您的对象,然后在解除分配alertView时再次释放它。您的对象不能保留alertView,否则您将有一个保留周期