Проблема с NSStrings и UIAlertView

У меня возникла очень странная проблема при использовании этого UIAlertView. При просмотре Врача у них есть несколько кабинетов. При выборе одного из них вы получаете оповещение, предлагающее позвонить в это место или отобразить его на карте. Чтобы создать оповещение и иметь готовые данные, когда оповещение будет отклонено, я объявил 4 NSString (хотя мне, вероятно, нужно только 2) в заголовочном файле. (alertTitle, alertText, alertNumber и alertAddress)

При просмотре кода проблема заключается в том, где задействован alertAddress. Также помните о alertNumber. У меня было много сокращенного кода, но я расширил его, чтобы помочь себе найти проблему!

 -(IBAction)address1ButtonPressed:(id) sender {
        Formatter *pnf = [Formatter alloc];
        alertTitle = [physician objectForKey:ADDRESS1DESC_KEY];
        NSString *a = [physician objectForKey:ADDRESS1A_KEY];
        NSString *b =[physician objectForKey:ADDRESS1CITY_KEY];
        NSString *c =[physician objectForKey:ADDRESS1STATE_KEY];
        NSString *d = [physician objectForKey:ADDRESS1ZIP_KEY];
        NSString *p = [physician objectForKey:PHONE1A_KEY];
        alertAddress = [[NSString stringWithFormat:@"http://maps.google.com/maps?q=%@,+%@,+%@+%@",a,b,c,d] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        NSLog(@"%@",alertAddress);
        alertText = [NSString stringWithFormat:@"%@\n%@, %@ %@\n%@",a,b,c,d,[pnf stringFromPhoneNumber:p]];
        alertNumber = [p stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
        [pnf release];
        UIAlertView *phoneAlert = [[UIAlertView alloc] initWithTitle:alertTitle message:alertText delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Call",@"View Map",nil];
        [phoneAlert show];

        }

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

Однако alertAddress совсем не рад делать то же самое. даже попытка записать его в консоль вызывает ошибку EXC_BAD_ACCESS. alertAddress правильно регистрирует данные до того, как будет задействовано предупреждение, но доступ к этим данным вообще при обработке кнопки предупреждения вызывает проблему. Я даже использовал alertNumber, и код работает отлично.

Почему обе одинаковые переменные NSString ведут себя по-разному при одинаковом использовании?

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
    if (buttonIndex == 1) {
        NSLog(@"Dialing: %@",alertNumber);
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"tel://%@",alertNumber]]];      
    }
    if (buttonIndex == 2) {
        NSLog(@"Map Selected");
        NSLog(@"alertAddress contains: %@",alertAddress);
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://maps.google.com/maps?q=%@",alertAddress]]];     
    }
}

Вот соответствующие объявления в заголовочном файле...

@interface PhysicianDetailViewController: UIViewController {
    ...
    NSString *alertTitle;
    NSString *alertText;
    NSString *alertNumber;
    NSString *alertAddress;
...
}

@property (nonatomic, retain) NSString *alertTitle;
@property (nonatomic, retain) NSString *alertText;
@property (nonatomic, retain) NSString *alertNumber;
@property (nonatomic, retain) NSString *alertAddress;
...

И вот вывод консоли во время этого процесса, если это поможет....

    > 2010-10-29 11:09:17.954 [2672:307] http://maps.google.com/maps?q=123%20Main%20Street%0ASuite%20A,+Tampa,+FL+11111
    > 2010-10-29 11:09:21.657 [2672:307] Map Selected   
    > Program received signal:  “EXC_BAD_ACCESS”.
    > kill quit

person TheHockeyGeek    schedule 29.10.2010    source источник
comment
Это работает, если вы используете аксессор? Просто потому, что для alertAddress устанавливается значение autoreleased var.   -  person blindjesse    schedule 29.10.2010
comment
Разве он не должен быть сохранен, как указано в заголовочном файле? Dealloc не доставляет мне никаких проблем, когда я собираюсь выпустить его там. Так что я не думаю, что это автоматический выпуск. Даже если бы я поместил alertAddress = @BLEH; он по-прежнему терпит неудачу при доступе с помощью нажатия / закрытия кнопки предупреждения.   -  person TheHockeyGeek    schedule 29.10.2010


Ответы (1)


Используйте сеттер, чтобы сохранить экземпляр. Не забудьте отпустить его, когда он вам больше не понадобится.

self.alertAddress = [[NSString stringWithFormat:@"http://maps.google.com/maps?q=%@,+%@,+%@+%@",a,b,c,d] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

Сделайте то же самое с другими свойствами.

Другое дело, что у вас, похоже, утечка памяти:

UIAlertView *phoneAlert = [[UIAlertView alloc] initWithTitle:alertTitle message:alertText delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Call",@"View Map",nil];
[phoneAlert show];
//add release after showing alert
[phoneAlert release]; 
person lukewar    schedule 29.10.2010
comment
Я все еще путаюсь с использованием сеттера... но он точно работает. Спасибо - person TheHockeyGeek; 30.10.2010
comment
Думаю, мне следовало отправить свой предыдущий комментарий в качестве ответа... В любом случае, определенное свойство для переменной класса используется только в том случае, если вы используете установщик (self.alertAddress =). В противном случае переменная устанавливается напрямую, поэтому вам придется вручную добавлять сохранение в конец (что несколько неаккуратно). Надеюсь это поможет - person blindjesse; 30.10.2010