- (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: создать конкретный экземпляр! '
Вы уже инициализировали address этой строкой [NSMutableString string];, поэтому ваш вызов [address initWithString:placemark.locality]; пытается инициализировать уже инициализированный объект.
address
[NSMutableString string];
[address initWithString:placemark.locality];
Изменить это:
Кому:
[address setString:placemark.locality];
Описание класса NSString Ссылка на класс NSMutableString
Вы никогда не должны вызывать initWithString: без соответствующего alloc. Больше похоже на то, что вы хотите, это [address setString:placemark.locality]
[address setString:placemark.locality]
должно выглядеть примерно так:
address = placemark.locality;
или
[address appendString:placemark.locality];
в зависимости от того, что вы пытаетесь достичь.
На этом этапе ваша строка уже инициализирована, [строка NSMutableString] является вспомогательным методом, который существенно возвращает [[NSMutableString alloc] init] autorelease]. Вы пытаетесь повторно инициировать уже инициированный объект, что плохо.
Измените эту строку на [address appendString: placemark.locality];