本文介绍了UIAlertView 在未记录的方法上崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

由于一个难以捉摸的错误,我们的应用程序崩溃的频率约为 1,500 次启动中的 1 次.包括堆栈跟踪的相关部分.它作为回调被触发,所以我没有参考它在我自己的代码中发生的位置.

Our app has been crashing with a frequency of roughly 1 in 1,500 launches due to a bug that is proving elusive. The relevant portion of the stack trace is included. It's being fired as a callback so I have no reference for where it's occurring in my own code.

看起来发生了什么是有一个 UIViewAnimationState 对象正在调用 UIAlertView's 私有方法 (_popoutAnimationDidStop:finished:).唯一的问题是,此时 UIAlertView 似乎已被释放.我不会对警报视图做任何奇怪的事情.我把它们扔了,我等待用户输入.它们都是在发布之前显示的.

It looks like what's going on is there is a UIViewAnimationState object that is calling UIAlertView's private method (_popoutAnimationDidStop:finished:). Only problem is, it appears the UIAlertView has been dealloced by this point. I don't do anything weird with alert views. I throw them up, and I wait for user input. They are all shown before being released.

有人遇到过吗?在这一点上,我倾向于它是一个 Apple 错误.

Anyone encountered this? At this point, I'm leaning toward it being an Apple bug.

Thread 0 Crashed:
0   libobjc.A.dylib                 0x3138cec0 objc_msgSend + 24
1   UIKit                           0x326258c4 -[UIAlertView(Private) _popoutAnimationDidStop:finished:]
2   UIKit                           0x324fad70 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:]
3   UIKit                           0x324fac08 -[UIViewAnimationState animationDidStop:finished:]
4   QuartzCore                      0x311db05c run_animation_cal

lbacks

推荐答案

很可能 UIAlertView 试图在其委托被释放后调用它的方法.为了防止这种类型的错误,每当您将一个对象设置为另一个对象的委托时,请在委托对象的 dealloc 方法中将委托属性设置为 nil.例如

It's likely that UIAlertView is trying to call a method on its delegate after that delegate has been released. To prevent this type of bug, any time you set an object as another object's delegate, set the delegate property to nil in the delegate object's dealloc method. e.g.


@implementation YourViewController
@synthesize yourAlertView;

- (void)dealloc {
    yourAlertView.delegate = nil; // Ensures subsequent delegate method calls won't crash
    self.yourAlertView = nil; // Releases if @property (retain)
    [super dealloc];
}

- (IBAction)someAction {
    self.yourAlertView = [[[UIAlertView alloc] initWithTitle:@"Pushed"
                         message:@"You pushed a button"
                         delegate:self
                         cancelButtonTitle:@"OK"
                         otherButtonTitles:nil] autorelease];
    [self.yourAlertView show];
}

// ...

@end

这篇关于UIAlertView 在未记录的方法上崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-28 05:14