Сбой UIAlertView при недокументированном методе - PullRequest
7 голосов
/ 06 апреля 2010

Наше приложение зависало с частотой примерно 1 из 1500 запусков из-за ошибки, которая неуловима. Соответствующая часть трассировки стека включена. Он вызывается как обратный вызов, поэтому я не могу указать, где это происходит в моем собственном коде.

Похоже, что происходит UIViewAnimationState объект, который вызывает UIAlertView's закрытый метод (_popoutAnimationDidStop:finished:). Единственная проблема в том, что UIAlertView был устранен этим пунктом. Я не делаю ничего странного с бдительными взглядами. Я их подбрасываю и жду ввода пользователя. Все они показаны перед выпуском.

Кто-нибудь сталкивался с этим? На данный момент, я склоняюсь к тому, что это ошибка 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

lbacks

1 Ответ

12 голосов
/ 06 апреля 2010

Вероятно, что 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
...