UIAlertView, отказывающий на недокументированном методе

Наше приложение отказывало с частотой примерно каждого 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

черные цвета

7
задан DShah 6 January 2012 в 08:27
поделиться

1 ответ

Вероятно, что 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
12
ответ дан 6 December 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: