2012-03-07 3 views
2

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

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, даже до того, как управление достигает метод делегата, то приложение падает. Что может быть причиной. Что я делаю не так?

+1

Кажется, проблема с делегатом связана с памятью. Выпускается ли это перед представлением предупреждения? –

+0

Я пробовал автореферат. Но это не похоже на проблему. Даже с этим кажется, что «UIAlertView» выпускается преждевременно. –

+4

Это не имеет никакого отношения к 'UIAlertView'. Ответчик (я) - тот, который выпущен слишком рано. – basvk

ответ

8

Это «один взлом решения».
Надеюсь, это поможет вам понять, что ваш делегат является проблемой памяти. 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 в настоящее время освобождаться преждевременно

+0

Как я могу проверить, освобождается ли сам. Правильно ли NSLog? –

+1

@XaviValero Было бы более ясно, если вы поставите точку останова прямо перед тем, как вы покажете alertview и введите «po self» в gdb. Продолжайте проходить и набирать «po self», чтобы увидеть, когда само освобождается. Было бы неплохо бросить NSLog (@ «myClass deallocing»); в вашем методе dealloc –

2

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

Если бы я должен был догадку, вы забыли установить свой класс, чтобы ответить на UIAlertViews в качестве делегата

Вы могли бы что-то вроде этого не хватает:

@interface MyClass : UIViewController <UIAlertViewDelegate>

+0

Я сделал это. –

+0

Ну, это было достойно, я думаю. Это то, что я всегда забываю. –

+2

, даже если вы не установили, что он будет работать нормально, только для предупреждения о компиляторе – jasondinh

1

Если АРК активировать объект UIAlertView и не нужно выпускать его, он автоматически освобождает ваш объект.

Смежные вопросы