Iphone UIAlertView выбрасывает EXC_BAD_ACCESS.- Отредактировано, не вызвано UIAlertView - PullRequest
1 голос
/ 23 ноября 2010

Я не понимаю, почему это дает мне EXC_BAD_ACCESS.Базовый фон, я собираю и обрабатываю некоторую информацию, а затем использую модальное представление, чтобы позволить пользователю подтвердить, хочет ли он продолжить.

У меня есть кнопка на панели навигации, которая называется продолжить, которая вызывает мою функцию подготовки данных.

- (void)viewDidLoad {
    //Other stuff
    UIBarButtonItem *next = [[UIBarButtonItem alloc]
                                  initWithTitle:@"Next" 
                                  style:UIBarButtonItemStyleBordered
                                  target:self
                                  action:@selector(prepData)];
    self.navigationItem.rightBarButtonItem = next;
    [next release];
    [super viewDidLoad];
}

prepData:

-(void)prepData{
    /*
    There's a bunch of stuff going on here, if "mensaje" is not an empty NSString, there is some kind of error that wont let me go on, if not, everything in the data is fine
    */
    if(![mensaje isEqualToString:@""]){
        UIAlertView *alert = [[UIAlertView alloc] 
                              initWithTitle:nil
                              message:mensaje
                              delegate:nil 
                              cancelButtonTitle:@"Aceptar" 
                              otherButtonTitles:nil];
        [alert show];
        [alert release];
    }else{
        UIActionSheet *actionSheet = [[UIActionSheet alloc]
                                      initWithTitle:@"¿Esta seguro que desea realizar estas operaciones?" 
                                      delegate:self 
                                      cancelButtonTitle:@"Cancelar" 
                                      destructiveButtonTitle:@"Aceptar"
                                      otherButtonTitles:nil];
        [actionSheet showInView:self.view];
        [actionSheet release];
    }
}

Если я отлаживаю, я могу пройти весь процесс через prepData (), как только я нажимаю продолжить, я получаю EXC_BAD_ACCESS.Если я закомментирую [actionSheet release];Я не получаю исключения, но, насколько мне известно, точно так же, как представления предупреждений, листы действий "держатся" до тех пор, пока не показывают.

По крайней мере все книги, которые я читал, утверждают это, но это вполне возможночто я не понимаю что-то в автоматическом выпуске.

Просто для справки, предупреждение просто замечательно.

У кого-нибудь есть идеи, что здесь происходит?

Спасибо, Стефано.

Редактировать: понял, приведенный выше код для листов действий и представлений предупреждений в порядке, проблема заключалась в том, что я выпускал что-то, что позже пыталось автоматически выпустить.

Iесть цикл for, который делает это:

for(someConditions){
    NSString *montoFormateado = [[[NSString alloc] initWithFormat:@"%.2lf",[monto doubleValue]] stringByReplacingOccurrencesOfString:@"." withString:@","];
                    [_postBuild setObject:[NSString stringWithString:montoFormateado] forKey:[NSString stringWithString:iidvar]];
                    [montoFormateado release];
}                            
postBuild = [_postBuild mutableCopy];
[_postBuild release];

Теперь, похоже, ошибка заключалась в том, что при использовании [NSString strintWithString: montoFormateado] я оставлял эту строку для автоматического выпуска позже, но когда я выпустил _postBuildэта строка также была освобождена, я удалил ее и просто использовал setObject: montoFormateado и он работает нормально.

Утечка памяти, но я думаю, что это длядругой вопрос, exc_bad_access был решен.

Ответы [ 4 ]

4 голосов
/ 23 ноября 2010

Самый простой способ найти ошибку такого рода - использовать переменную окружения NSZombieEnabled.

Когда вы получаете EXC_BAD_ACCESS в конце вызова, это обычно означает, что что-то автоматически высвобождается, но его счет удержания уже равен 0, когда вы его отпускаете.

Проверьте этот пост , это спасет вашу жизнь много раз. Если это не сработает, оставьте комментарий, и мы вернем наши заглавные буквы отладки:)

1 голос
/ 23 ноября 2010

Я думаю, что в коде, который вы не показывали, слишком много выпусков (в разделе «Здесь много чего происходит, если« mensaje »не пустой блок NSString»).

Нет ничего плохого в вашем коде actionSheet. Как вы говорите, он должен освободить себя, как только его больше нет на экране. Но если вы перевыпустили одно из вложенных представлений self.view, это может привести к сбою при истощении пула автоматического выпуска.

0 голосов
/ 23 ноября 2010

В обоих случаях, если вы собираетесь «выпустить», лучше сначала «сохранить».

В случае UIActionSheet - я считаю, что представление, переданное в showInView, сохраняет копию таблицы действий..

В AlertView это не так.

0 голосов
/ 23 ноября 2010

Может быть, вы выпускаете UIAlertView перед его использованием, попробуйте удалить оператор release и объявить UIAlertView как автоматический выпуск (хотя все должно быть в порядке, как у вас)

   if(![mensaje isEqualToString:@""]){
        UIAlertView *alert = [[UIAlertView alloc] 
                              initWithTitle:nil
                              message:mensaje
                              delegate:nil 
                              cancelButtonTitle:@"Aceptar" 
                              otherButtonTitles:nil] autorelease];
        [alert show];

Еще одна вещь, что онвозможно, вы снова отпускаете этих ребят по какому-то обратному вызову или что-то в этом роде, вам следует убедиться, что вы этого не делаете, и, как сказал автор над мной, вы можете использовать зомби, чтобы выяснить это.

...