2011-07-25 8 views
7

Estoy trabajando en una aplicación llamada whereami del capítulo 5 de la "Guía de BNR para iOS". Tengo la aplicación funcionando y la dejé en mi teléfono para mostrarle a la esposa y a la familia que estoy aprendiendo cosas. Sin embargo, exhibe un comportamiento de colisión regular. Esto es lo que sucede ....Estoy aprendiendo el desarrollo de iOS y tengo una aplicación MapKit fallando. Necesito ayuda para entender este registro de bloqueo

Cuando se abre por primera vez la aplicación y ejecuta lo hace bien, Si llega a casa y luego abrirlo de nuevo dentro de unos pocos minutos lo hace muy bien, Si lo deja en el de fondo luego vuelva a abrir más de unos minutos (digamos como 5 o más) más tarde se bloquea. Luego puede volver a abrirlo y funciona bien, pero el patrón se repite.

He comprobado dos veces todo mi código con el libro y miré en la página de erratas, pero no puedo entender qué podría estar mal. El organizador de Xcode muestra los registros de todos los bloqueos, pero todavía no sé cómo leerlos. Estaba empezando a preguntarme si, dado que esta es solo una aplicación de proyecto de aprendizaje, no diseñada para un uso real, tal vez le falta algo que la haga multitarea/fondo/reabrir ??? ¿correctamente? Estoy usando Xcode 4.1 en Lion con iPhone 4 con iOS 4.3.4. Agradecería cualquier ayuda que alguien pueda ofrecer.

Esto es lo que creo que es la parte correspondiente del registro de bloqueo:

Incident Identifier: 352B538C-75BB-4BDF-9C2B-EC9613CE1B44 
CrashReporter Key: 5896ed7851b999169919cab30c69940f74ed6b0c 
Hardware Model:  iPhone3,1 
Process:   WhereAmI [775] 
Path:   /var/mobile/Applications/DB57A854-01F8-460F-B8CD-38B8FC50FBAF/WhereAmI.app/WhereAmI 
Identifier:  WhereAmI 
Version:   ??? (???) 
Code Type:  ARM (Native) 
Parent Process: launchd [1] 

Date/Time:  2011-07-23 18:47:19.093 -0400 
OS Version:  iPhone OS 4.3.4 (8K2) 
Report Version: 104 

Exception Type: EXC_CRASH (SIGABRT) 
Exception Codes: 0x00000000, 0x00000000 
Crashed Thread: 0 

Thread 0 name: Dispatch queue: com.apple.main-thread 
Thread 0 Crashed: 
0 libsystem_kernel.dylib   0x356d8a1c __pthread_kill + 8 
1 libsystem_c.dylib    0x34d543b4 pthread_kill + 52 
2 libsystem_c.dylib    0x34d4cbf8 abort + 72 
3 libstdc++.6.dylib    0x35434a64 __gnu_cxx::__verbose_terminate_handler() + 376 
4 libobjc.A.dylib     0x35fdd06c _objc_terminate + 104 
5 libstdc++.6.dylib    0x35432e36 __cxxabiv1::__terminate(void (*)()) + 46 
6 libstdc++.6.dylib    0x35432e8a std::terminate() + 10 
7 libstdc++.6.dylib    0x35432f5a __cxa_throw + 78 
8 libobjc.A.dylib     0x35fdbc84 objc_exception_throw + 64 
9 CoreFoundation     0x3504d3c6 -[NSException raise] + 2 
10 MapKit       0x3389bcb2 -[MKMapView setRegion:animated:] + 318 
11 WhereAmI      0x000029cc -[WhereAmIAppDelegate mapView:didUpdateUserLocation:] (WhereAmIAppDelegate.m:52) 
12 MapKit       0x338a11b6 -[MKMapView(UserPositioningInternal) resetUserLocation] + 142 
13 MapKit       0x338a074e -[MKMapView(UserPositioningInternal) locationManagerDidReset:] + 22 
14 CoreFoundation     0x34fbaefc -[NSObject(NSObject) performSelector:withObject:] + 16 
15 CoreFoundation     0x34ff82f2 -[NSArray makeObjectsPerformSelector:withObject:] + 394 
16 MapKit       0x33893802 -[MKLocationManager _reportLocationStatus:] + 34 
17 MapKit       0x338937ce -[MKLocationManager _reportLocationReset] + 14 
18 MapKit       0x33894d24 -[MKLocationManager reset] + 88 
19 MapKit       0x338770a2 -[MKLocationManager applicationResumed:] + 62 
20 Foundation      0x30fa017c _nsnote_callback + 136 
21 CoreFoundation     0x3501c208 __CFXNotificationPost_old + 396 
22 CoreFoundation     0x34fb6ee4 _CFXNotificationPostNotification + 112 
23 Foundation      0x30f9d5cc -[NSNotificationCenter postNotificationName:object:userInfo:] + 64 
24 UIKit       0x3640f720 -[UIApplication _handleApplicationResumeEvent:] + 900 
25 UIKit       0x362b9e20 -[UIApplication handleEvent:withNewEvent:] + 2724 
26 UIKit       0x362b920e -[UIApplication sendEvent:] + 38 
27 UIKit       0x362b8c4c _UIApplicationHandleEvent + 5084 
28 GraphicsServices    0x35827e70 PurpleEventCallback + 660 
29 GraphicsServices    0x35827efa PurpleEventSignalCallback + 10 
30 CoreFoundation     0x35024a72 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 6 
31 CoreFoundation     0x35026758 __CFRunLoopDoSources0 + 376 
32 CoreFoundation     0x350274e4 __CFRunLoopRun + 224 
33 CoreFoundation     0x34fb7ebc CFRunLoopRunSpecific + 224 
34 CoreFoundation     0x34fb7dc4 CFRunLoopRunInMode + 52 
35 GraphicsServices    0x35827418 GSEventRunModal + 108 
36 GraphicsServices    0x358274c4 GSEventRun + 56 
37 UIKit       0x362e3d62 -[UIApplication _run] + 398 
38 UIKit       0x362e1800 UIApplicationMain + 664 
39 WhereAmI      0x000027c0 main (main.m:14) 
40 WhereAmI      0x00002768 start + 32 

soy muy nuevo en esto, pero estoy adivinando que la última función llamada está aquí:

8 libobjc.A.dylib     0x35fdbc84 objc_exception_throw + 64 
9 CoreFoundation     0x3504d3c6 -[NSException raise] + 2 
10 MapKit       0x3389bcb2 -[MKMapView setRegion:animated:] + 318 
11 WhereAmI      0x000029cc -[WhereAmIAppDelegate mapView:didUpdateUserLocation:] (WhereAmIAppDelegate.m:52) 

el código del método de WhereAmIAppDelegate.m está aquí: comprobar

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{ 
    // Zoom in on user here 
    CLLocationCoordinate2D loc = [userLocation coordinate]; 
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(loc, 250, 250); 
    [worldView setRegion:region animated:YES]; 

} 

Respuesta

3

probar si la región tiene un cierto valor. También cambie 250 a 250.0. Dame algunos comentarios. :)

+0

Gracias por su respuesta, cambiaré 250 - 250.0 de inmediato. ¿Es eso para tratar de arreglar mi problema o simplemente porque esa es una mejor forma? Más importante, ¿dónde comprobo si la región tiene un valor? Tengo la mayoría de las cosas manejadas por applictionDidFinishLoading: withOptions o en el corresponsal delegado de mapView. – vichudson1

+0

Porque el método probablemente acepte flotantes en lugar de ints. – Peres

+0

Se cambió el int a flotadores. Estoy tratando de ver si la región tiene un valor antes de enviar el mensaje [worldView setRegion: region]. ¿Cómo se comprueba si la región tiene un valor? He intentado si (region! = NIL) sin suerte. A Xcode no parece gustarle eso. Tengo experiencia en C++ pero soy nuevo en el objetivo C. – vichudson1

7

Me encontré con este problema con la 3ª edición del libro y vi que fue respondido en los foros de la segunda edición del libro, pero no aquí. El problema es que WhereAmIAppDelegate recibe una ubicación no válida cuando la aplicación vuelve a ejecutarse en segundo plano durante más de 5-10 minutos. No estoy seguro de por qué sucede esto, pero así es como me fijo:

- (void)mapView:(MKMapView *)mapView 
    didUpdateUserLocation:(MKUserLocation *)userLocation 
{ 
    // Here we are... but how do we actually zoom? 
    CLLocationCoordinate2D loc = [userLocation coordinate]; 
    if(CLLocationCoordinate2DIsValid(loc)) 
    { 
     MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(loc, 320, 480); 
     [worldView setRegion:region animated:YES]; 
    } 
} 

Siento "necro" un viejo hilo, pero pensé que esto podría ayudar a alguien en busca de ayuda. Por cierto, estoy usando Xcode 4.3.2 e iOS 5.1.

Cuestiones relacionadas