Ошибка при назначении переменной NSString в блоке - PullRequest
1 голос
/ 12 октября 2011
    - (NSString *) geocodeAddressFromCoordinate:(CLLocationCoordinate2D)coordinate
    {
        CLLocation *location = [[CLLocation alloc]initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
        __block NSMutableString * address = [NSMutableString string];  
        geocoder = [[CLGeocoder alloc]init];
        [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) 
         {
             if (error) {     
                 NSLog(@"%@", [error localizedDescription]);
                 UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"No results were found" message:@"Try another search" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil, nil];
                 alert.show;
                 return;
             }
             if ([placemarks count]>0) 
             {   
                 NSLog([placemarks description]);
                 CLPlacemark *placemark = [placemarks objectAtIndex:0];
                 NSLog(placemark.locality);
//This line makes an error
                 [address initWithString:placemark.locality];**
             }
         }];
        return address;
    }

Получена следующая ошибка во время выполнения:

* Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «* метод инициализации -initWithCharactersNoCopy: length: freeWhenDone: невозможно отправить абстрактному объекту класса __NSCFString: создать конкретный экземпляр! '

Ответы [ 4 ]

3 голосов
/ 12 октября 2011

Вы уже инициализировали address этой строкой [NSMutableString string];, поэтому ваш вызов [address initWithString:placemark.locality]; пытается инициализировать уже инициализированный объект.

Изменить это:

[address initWithString:placemark.locality];

Кому:

[address setString:placemark.locality];

Описание класса NSString
Ссылка на класс NSMutableString

3 голосов
/ 12 октября 2011

Вы никогда не должны вызывать initWithString: без соответствующего alloc. Больше похоже на то, что вы хотите, это [address setString:placemark.locality]

2 голосов
/ 12 октября 2011
[address initWithString:placemark.locality];

должно выглядеть примерно так:

address = placemark.locality;

или

[address appendString:placemark.locality];

в зависимости от того, что вы пытаетесь достичь.

1 голос
/ 12 октября 2011

На этом этапе ваша строка уже инициализирована, [строка NSMutableString] является вспомогательным методом, который существенно возвращает [[NSMutableString alloc] init] autorelease]. Вы пытаетесь повторно инициировать уже инициированный объект, что плохо.

Измените эту строку на [address appendString: placemark.locality];

...