2014-11-20 19 views
27

ChiamoLa vista di avviso scompare da sola quando si chiama [locationManager requestWhenInUseAuthorization];

[locationManager requestWhenInUseAuthorization]; 

su uno schermo che mostra una MKMapView (showsUserLocation = YES). Che sembra strano in primo luogo (Apple dovrebbe gestire questo per MKMapView automaticamente, ma XCode si lamentava quando non l'ho fatto).

Quindi ottengo la vista di avviso che dice che l'applicazione vuole utilizzare la posizione, ma poi la vista di avviso scompare da sola.

Perché la vista di avviso scompare da sola?

L'unica cosa che posso pensare è che sto chiamando requestWhenInUseAuthorization nel metodo initWithCoder. Lo sto facendo solo perché penso di aver visto il reclamo Xcode quando lo chiamavo da viewDidLoad.

risposta

77

Probabilmente stai facendo ARC. Assicurarsi di avere ancora un riferimento a CLLocationManager. Puoi facilmente farlo rendendolo una proprietà.

ARC sta per Conteggio di riferimento automatico. In un progetto abilitato ARC (ea meno che tu non stia lavorando su qualcosa di molto vecchio o lo hai disattivato di proposito, il tuo progetto è un progetto abilitato ARC) devi mantenere i riferimenti agli oggetti che userai in seguito. CLLocationManager non restituisce un singleton, quindi è necessario mantenere un riferimento ad esso nelle classi a cui interessa. Qualcosa di simile a questo:

@property (strong, nonatomic) CLLocationManager *locationManager 

Vedi Apple ARC documentation per i dettagli. (E grazie Falko per la ricerca del profondo legame con quello.)

+1

Hmm, sembra probabile. Lo guarderò. – Fraggle

+3

Grazie! Sto passando a Swift e ho pensato che CLLocationManager() restituisse un singleton. –

+1

[Automatic Reference Counting (ARC)] (https://developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html) – Falko