Сбой при нажатии UIAlertView - PullRequest
2 голосов
/ 07 марта 2012

Когда я нажимаю UIAletView, я получаю следующую ошибку.

alertView:clickedButtonAtIndex:]: message sent to deallocated instance 0x84c7010

Это код, который я использовал.

    UIAlertView  *testAlert = [[ UIAlertView alloc]initWithTitle:messageTitle message:messageBody delegate:self cancelButtonTitle:messageClose otherButtonTitles:messageTryAgain, nil];
    testAlert.tag = 2;
    [testAlert show];
    [testAlert release];

И у меня есть метод делегата

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{

}

Когда я нажимаю UIAlertView, даже до того, как элемент управления достигает метода делегата, приложение вылетает Что может быть причиной. Что я делаю не так?

Ответы [ 3 ]

8 голосов
/ 07 марта 2012

Это «один взлом решения».
Надеюсь, это поможет вам понять, что ваш делегат - это проблема с памятью.Delegete (в данном случае self) каким-то образом освобождается до того, как testAlert отклоняется

  // retain self to avoid crash you were experiencing earlier
UIAlertView  *testAlert = [[ UIAlertView alloc]initWithTitle:messageTitle message:messageBody delegate:[self retain] cancelButtonTitle:messageClose otherButtonTitles:messageTryAgain, nil];
testAlert.tag = 2;
[testAlert show];
[testAlert release];


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
  // release self because you've gotten past the crash
  [self release];
}

Это никоим образом не является элегантным решением и должно побуждать вас к дальнейшей отладке приложения, чтобы выяснить, почемуself преждевременно освобождается

2 голосов
/ 07 марта 2012

Просто интересно, не могли бы вы показать нам ваш .h файл?

Если бы мне пришлось рисковать догадкой, вы забыли настроить свой класс так, чтобы он отвечал на UIAlertViews в качестве делегата

Возможно, вы упускаете что-то вроде этого:

@interface MyClass : UIViewController <UIAlertViewDelegate>

1 голос
/ 07 марта 2012

Если ARC разрешает сохранение объекта UIAlertView и не нужно его освобождать, он автоматически освобождает ваш объект.

...