EXCELENTE MAL ACCESO con IBACTION


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 gestión de memoria.

La cosa es, la mía no parece (! :)) estar allí. La cosa es, simplemente agregué un botón en IB, rect redondeado, sin imagen. Lo conecté con una IBACTION que definí en mi clase. Este método no hace nada (!) por cierto.

De todos modos, tan pronto como hago 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é pasa ahí?

Alguna pista?

Este es mi registro de 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 obtengo, después de subir a 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
Author: Icky, 2010-01-15

3 answers

También fui torturado por esto durante unas horas. 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 mantendría cuando se pasa como el controlador raíz del UINavigationController, pero eso resultó ser incorrecto. La solución fue asignar el controlador a un variable local y liberarla 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];
}
 53
Author: gammal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-24 01:42:13

Como gammal y otros señalaron, esto es un problema de memoria. Tiene que ver con la referencia del controlador que cae fuera del alcance y por lo tanto su memoria está desasignada.

Si inicia el controlador de esta manera:

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

Estará bien si no está utilizando ARC, porque la referencia no se desasignará hasta que se libere manualmente. Así que he tenido este problema al actualizar proyectos para usar ARC.

Si inicia el controlador como autorelease, o está utilizando ARC, entonces como tan pronto como finalice el ámbito en el que existe el controlador, el recolector de basura desasignará el controlador y los eventos de pulsación de botón causarán excepciones de memoria defectuosa.

La forma de resolver esto es mantener viva la referencia, así que declararla en la interfaz, o si necesita acceso externo como una propiedad.

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

Luego añádelo como:

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

Si desea que la memoria se recopile más tarde, simplemente establezca el valor en nil.

 4
Author: OnlyJoe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-17 01:18:34

Tengo una idea. Eso me pasó hace años. EN IB, ¿su propiedad View está conectada a su view ?

Una vez desenganché estos, y la aplicación nunca se lanzó.

Por cierto, peor viene a peor, iniciar 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 ; -)

 0
Author: Sam Jarman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-15 11:15:01