Наше приложение отказывало с частотой примерно каждого 1500-го запуска из-за ошибки, которая оказывается неуловимой. Соответствующая часть отслеживания стека включена. Это запускается как обратный вызов, таким образом, у меня нет ссылки для того, где это происходит в моем собственном коде.
Похоже на то, что продолжается, существует a UIViewAnimationState
объект, который звонит UIAlertView's
закрытый метод (_popoutAnimationDidStop:finished:
). Только проблема, это появляется UIAlertView
был dealloced этой точкой. Я не делаю ничего странного с аварийными представлениями. Я подбрасываю их, и я ожидаю ввода данных пользователем. Их все показывают прежде чем быть выпущенным.
Кто-либо встретился с этим? На данном этапе я склоняюсь к нему являющийся ошибкой Apple.
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
черные цвета
Вероятно, что UIAlertView пытается вызвать метод своего делегата после того, как этот делегат был освобожден. Чтобы предотвратить этот тип ошибки, каждый раз, когда вы устанавливаете объект в качестве делегата другого объекта, установите для свойства делегата значение nil в методе dealloc объекта делегата. например
@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