由于一个难以捉摸的错误,我们的应用程序崩溃的频率约为每 1,500 次启动中就有 1 次崩溃。包括堆栈跟踪的相关部分。它作为回调被触发,所以我没有关于它在我自己的代码中发生的位置的引用。
看起来发生的事情是有一个 UIViewAnimationState
对象正在调用 UIAlertView
私有(private)方法 (_popoutAnimationDidStop:finished:
)。唯一的问题是,此时 UIAlertView 似乎已被释放。我不会用警报 View 做任何奇怪的事情。我把它们扔掉,然后等待用户输入。它们都在发布之前展示过。
有人遇到过这种情况吗?目前,我倾向于认为这是 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
回帖
最佳答案
在委托(delegate)被释放后,UIAlertView 可能会尝试调用其委托(delegate)上的方法。为了防止这种类型的错误,每当您将一个对象设置为另一个对象的委托(delegate)时,请在委托(delegate)对象的 dealloc 方法中将委托(delegate)属性设置为 nil。例如
@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
关于iphone - UIAlertView 在未记录的方法上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2581081/