Проблем с NSStrings и UIAlertView

Имам много странен проблем, когато използвам този UIAlertView. При преглед на лекар има няколко кабинета. След като изберете такъв, получавате предупреждение, което предлага да се обадите на това местоположение или да го покажете на карта. За да създам предупреждението и да имам готови данни, когато предупреждението бъде отхвърлено, декларирах 4 NSStrings (въпреки че вероятно имам нужда само от 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 е зададен на автоматично пусната променлива.   -  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