AVISO: Cualquier pregunta que no cumpla ninguno de estos criterios podrá ser borrada sin previo aviso.

Buenos días,

Llevo días rompiéndome la cabeza con este tema y no consigo encontrar ni solución ni referencia alguna al problema. Al lío:

Para simplificar el problema que estoy sufriendo en otro proyecto, creo desde Xcode 4.3.1 un nuevo proyecto de tipo "Single View Application" y marco "Use Automatic Reference Counting". Por razones de compatibilidad con iOS 4 fijo el Deployment Target a la 4.0 tanto en Project como en Targets.

Necesito hacer un "reverse geocoder" de unas coordenadas para obtener la ubicación correspondiente. Para iOS 5.x tenemos la clase CLGeocoder. Para iOS 4.x no nos queda mas remedio que utilizar la clase "deprecated" MKReverseGeocoder. Importo el framework MapKit.

ViewController.h:

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>

@interface ViewController : UIViewController <MKReverseGeocoderDelegate>

@end

ViewController.m:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSLog(@"viewDidLoad");
    CLLocationCoordinate2D coord;
    coord.latitude = 41.38791708;
    coord.longitude = 2.1699187;

    MKReverseGeocoder *geocoder = [[MKReverseGeocoder alloc] initWithCoordinate:coord];
    NSLog(@"%p", geocoder);
    NSLog(@"%p", [geocoder delegate]);
    [geocoder setDelegate:self];
    NSLog(@"%p", [geocoder delegate]);
    [geocoder start];
    NSLog(@"Starting geocoding...");
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark  {
    NSLog(@"It works: %@", placemark);    
}

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error {
    NSLog(@"It fails: %@", [error localizedDescription]);
}

@end

Si ejecuto el proyecto tanto en el simulador como en un dispositivo con iOS5, funciona pefectamente. En cambio, si lo ejecuto con el simulador de la 4.3 o en un dispositivo (con 4.2.1) ni siquiera se hace la llamada a ninguno de los métodos delegados didFindPlaceMark o didFailWithError.

Ahora bien, si en las opciones de compilación pongo para el ViewController.m el flag "-fno-objc-arc" funciona en todos los casos (lo he probado también creando un proyecto idéntico pero si marcar "Use Automatic Reference Counting" y funciona).

La duda pues es: si se supone que ARC está soportado en iOS4 y MKReverseGeocoder aunque "deprecated" debería seguir funcionando, ¿porqué no es así en este caso?

Saludos y perdón por el rollo.

preguntado 15 Mar '12, 13:20

Saro's gravatar image

Saro
5341510


Tendras que hacerte una property de tipo strong para el MKReverseGeocoder.

En tu caso , el ARC hace un release en el momento despues de tu [geocoder start] porque no tienes un owner de este objeto;

Una vez que terminas con el haces self.geocoder = nil;

No estoy seguro porque te funciona en un 5.0, pero creo que lo correcto es hacerlo como te indico mas arriba.

enlace permanente

respondido 15 Mar '12, 14:08

StaS's gravatar image

StaS
5.1k953

editó 15 Mar '12, 14:10

Mira que le había dado vueltas al asunto... Con lo fácil que era!!

Muchísimas gracias por tu respuesta.

(15 Mar '12, 14:14) Saro
Tu respuesta:
Activar/desactivar vista previa

Sobre esta pregunta

Etiquetas de la pregunta:

×11
×7
×1

Pregunta realizada el: 15 Mar '12, 13:20

Pregunta visitada: 444 veces

Última modificación: 15 Mar '12, 14:14

Seguir esta pregunta

Por Email:

Una vez que entres podrás suscribirte desde aquí para recibir actualizaciones

Por RSS:

Respuestas

Respuestas y Comentarios

Realizar Donación