2010-01-15 16 views
24

He leído mucho sobre este tema, pero el mío todavía parece ser diferente de alguna manera. Por lo que entendí, EXC_BAD_ACCESS ocurre con problemas de administración de memoria.EXC_BAD_ACCESS con IBACTION

El caso es que el mío no parece (! :)) estar allí. Lo que pasa es que, simple, agregué un botón en IB, recto redondeado, sin imagen. Lo conecté con una IBACCIÓN que definí en mi clase. Este método no hace nada (!) Por cierto.

De todos modos, tan pronto como haga clic en el botón, la aplicación se bloquea, con "EXC_BAD_ACCESS".

Seguramente no estoy exagerando nada, por lo que puedo ver, eso es. ¿Qué está mal allí?

¿Alguna pista?

Ésta es mi registro de la consola:

Loading program into debugger… 
sharedlibrary apply-load-rules all 
Program loaded. 
target remote-mobile /tmp/.XcodeGDBRemote-148-79 
Switching to remote-macosx protocol 
mem 0x1000 0x3fffffff cache 
mem 0x40000000 0xffffffff none 
mem 0x00000000 0x0fff none 
run 
Running… 
[Switching to thread 11779] 
[Switching to thread 11779] 
(gdb) continue 
2010-01-15 09:16:34.800 FlightControl1[1899:207] Table loaded 
2010-01-15 09:16:35.200 FlightControl1[1899:207] 23 
2010-01-15 09:16:35.350 FlightControl1[1899:207] debug 
Program received signal: “EXC_BAD_ACCESS”. 
(gdb) 

Esto es lo que me pasa, después de ir arriba en la pila:

#0 0x31ec3ebc in objc_msgSend() 
#1 0x33605784 in -[UIApplication sendAction:to:from:forEvent:]() 
#2 0x336056ec in -[UIApplication sendAction:toTarget:fromSender:forEvent:]() 
#3 0x336056b4 in -[UIControl sendAction:to:forEvent:]() 
#4 0x3360530c in -[UIControl(Internal) _sendActionsForEvents:withEvent:]() 
#5 0x33605f8c in -[UIControl touchesEnded:withEvent:]() 
#6 0x335fd9ac in _UIGestureRecognizerUpdateObserver() 
#7 0x30da1830 in __CFRunLoopDoObservers() 
#8 0x30de9346 in CFRunLoopRunSpecific() 
#9 0x30de8c1e in CFRunLoopRunInMode() 
#10 0x332e7374 in GSEventRunModal() 
#11 0x335adc30 in -[UIApplication _run]() 
#12 0x335ac230 in UIApplicationMain() 
#13 0x000027a8 in main (argc=1, argv=0x2ffff4d8) at /Users/SomePath/main.m:14 
+0

¿Puedes pegar en el registro de la consola por favor? –

+0

, tenga en cuenta también que la IBACCIÓN en sí misma no es más que un marcador de posición para que IB pueda usar para encontrar elementos. mira el código después del preprocesamiento, las IBACCIONES son inexistentes – KevinDTimm

+0

Agregué el registro de mi consola a la pregunta. @kevin: No estoy seguro de qué hacer exactamente, para ser honesto. – Icky

Respuesta

53

Fui torturado por esto durante unas horas también. Resultó ser un problema de memoria como se esperaba. El controlador que actúa como el objetivo para el botón fue desasignado. Era el controlador raíz de un controlador de navegación cuya vista se agregó directamente a la ventana. Mi código se veía así:

MyController *myController = [[MyController new] autorelease]; 
UINavigationController* navController = 
    [[[UINavigationController alloc] initWithRootViewController:myController] autorelease]; 
[window addSubview:navController.view]; 

Mi suposición era que myController se retendrían cuando se pasa como el controlador raíz del UINavigationController, pero que resultó ser errónea. La solución fue asignar el controlador a una variable local y liberarlo en dealloc. La interfaz del objeto que contiene el código anterior debe tener:

... 
@property (retain, nonatomic) MyController *myController; 
... 

Y la aplicación:

self.myController = [[MyController new] autorelease]; 
UINavigationController* navController = 
    [[[UINavigationController alloc] initWithRootViewController:myController] autorelease]; 
[window addSubview:navController.view]; 

... 

- (void)dealloc { 
    [self.myController release]; 
    ... 
    [super dealloc]; 
} 
+0

¡GRACIAS! initWithRootViewController no conserva la vista raíz es una locura. – esbenr

+0

qué hacer en ARC ??? –

+0

¿Está presentando el controlador de navegación justo después de su asignación? –

0

Tengo un pensamiento. Eso me pasó hace años. EN IB, ¿su propiedad de View está conectada a su vista?

Desenganché una vez, y la aplicación nunca se lanzó.

Por cierto, peor empeora, comience el proyecto de nuevo. No vale la pena estos dolores de cabeza si has hecho 2 minutos de trabajo hasta el momento.

bienvenido al mundo de la programación de iPhone. Es posible que necesite uno de estos bastante pronto wigsmen.com ;-)

4

Como Gammal y otros señalaron que este es un problema de memoria. Tiene que ver con que la referencia del controlador caiga fuera del alcance y su memoria se desasigna.

Si usted inicia el controlador de la siguiente manera:

MyController* controller = [[MyController alloc] initWithNibName:@"MyNib" bundle:nil]; 
[self.view addSubview:controller.view]; 

Va a estar bien si no está utilizando ARC, porque la referencia no se cancela la asignación hasta que se libera manualmente. Así que tuve este problema al actualizar proyectos para usar ARC.

Si inicia el controlador como de liberación automática, o está utilizando ARC, tan pronto como el alcance del controlador exista, el recolector de basura desasignará el controlador y los eventos de presionar botones ocasionarán malas excepciones de memoria.

La forma de resolver esto es mantener viva la referencia, por lo que debe declararse en la interfaz o si necesita acceso externo como propiedad.

@interface MyParentController : UIView { 
@private 
    MyController* controller; 
} 

después añadirlo como:

controller = [[MyController alloc] initWithNibName:@"MyNib" bundle:nil]; 
[self.view addSubview:controller.view]; 

Si usted quiere que la memoria a percibir más tarde, acaba de establecer el valor a cero.

Cuestiones relacionadas