UIAlertView вызывает EXC_BAD_ACCESS - PullRequest
0 голосов
/ 27 октября 2010

Я получаю ошибку с помощью следующего кода. По сути, приложение подтверждает вызов номера, когда он выбран в представлении таблицы. EXC_BAD_ACCESS приходит, когда ViewContoller с этим предупреждением закрывается.

Это происходит только в случае срабатывания предупреждения. Нет, если таблица просматривается только без выбора. Это говорит мне, что я делаю что-то не так с этим UIAlertView. Вероятно, что-то связанное с управлением памятью и выпуском чего-то, чего я не должен делать.

Куда я иду не так?

phoneAlert = [[[UIAlertView alloc] initWithTitle:locationName message:displayNumber delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Call",nil] autorelease];
    [phoneAlert show];
[tableView deselectRowAtIndexPath:indexPath animated:YES];


- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
    if (buttonIndex == 1) {
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"tel://%@",dialNumber]]];       
    }

}

- (void)dealloc {
    [locations release];
    [location release];
    [dialNumber release];
    [phoneAlert release];
        [super dealloc];
}

1 Ответ

3 голосов
/ 27 октября 2010

Вы присваиваете phoneAlert для автоматически выпущенного UIAlertView, который не сохраняется вашим экземпляром, потому что вы не используете точечный синтаксис или методы установки, вы делаете прямое назначение .

Итак, если вы определили phoneAlert как свойство с ключевым словом retain, то вы должны сделать это, чтобы получить желаемый результат:

self.phoneAlert = ...

или

[self setPhoneAlert:...];

В противном случае вы получите EXC_BAD_ACCESS в вашем методе dealloc, потому что вы autorelease d просмотрели оповещений, поэтому экземпляр был освобожден пулом автоматического выпуска. Включите зомби в своем проекте, чтобы увидеть это в действии.

...