ARC应用程序中的UIAlertView

Ala*_*per 3 iphone automatic-ref-counting

我有一个按钮的iphone示例应用程序.点按它会调用代码:

UIAlertView *alert = [[UIAlertView alloc]
                          initWithTitle:@"test"
                          message:@"test"
                          delegate:self
                          cancelButtonTitle:@"Ok"
                          otherButtonTitles: nil];
[alert show];
Run Code Online (Sandbox Code Playgroud)

应用程序已启用ARC.

问题是,如果我在警报中单击"确定"按钮,应用程序将与EXC_BAD_ADDRESS崩溃 - 可能是因为警报已被弧线删除.

建议的解决方法是什么?不向viewcontroller添加属性

谢谢

Sha*_*ell 5

我的猜测是你没有实现UIAlertViewDelegate方法或者自己已超出范围.

如果您不关心在有人解除警报框时收到警报,请将委托更改为nil.例如

UIAlertView *alert = [[UIAlertView alloc]
                          initWithTitle:@"test"
                          message:@"test"
                          delegate:nil
                          cancelButtonTitle:@"Ok"
                          otherButtonTitles: nil];
[alert show];
Run Code Online (Sandbox Code Playgroud)


小智 5

UIAlertView的委托属性被声明为弱引用(由assign关键字指示).这意味着ARC不会增加保留计数,您需要保留对委托对象的引用(无论是自身还是单独的对象).应该在UIAlertView的整个生命周期内保留此引用.

@property(nonatomic,assign) id /*<UIAlertViewDelegate>*/ delegate;    // weak reference
Run Code Online (Sandbox Code Playgroud)

我假设这样做的原因是为了防止循环和发布失败,因为在常见情况下,创建UIAlertView的对象将保留对它的引用并且是委托,因此关闭循环并阻止释放.

这可能是代表们的常见模式,但直到我遇到完全相同的问题我才意识到.我在启用了僵尸检测的模拟器中运行,它清楚地表明了引用计数,我看到它没有被UIAlertView保留.那是我检查头文件的时候.

此问题的答案提供了有关系统类和assign关键字的委托的一些其他信息. iPhone ARC发行说明 - 系统类代理上的dealloc?