UIAlertViewDelegate en aplicaciones de lockings de class por separado

Tengo dificultades con la delegación UIAlertView en una class que no sea ViewController . Todo está bien hasta que el usuario haga OK button OK , la aplicación se cuelga con

 Thread 1: EXC_BAD_ACCESS (code=2, address 0x8) 

ViewController.h:

 #import <UIKit/UIKit.h> #import "DataModel.h" @interface ViewController : UIViewController @end 

ViewController.m:

 #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { DataModel *dataModel = [[DataModel alloc] init]; [dataModel ShowMeAlert]; [super viewDidLoad]; } @end 

DataModel.h

 #import <Foundation/Foundation.h> @interface DataModel : NSObject <UIAlertViewDelegate> - (void)ShowMeAlert; @end 

DataModel.m

 #import "DataModel.h" @implementation DataModel - (void)ShowMeAlert; { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Info" message:@"View did load!" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; } #pragma mark - UIAlertView protocol - (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { NSLog(@"Index: %d", buttonIndex); } @end 
  • Si el código para mostrar la alerta y sus methods de delegación está en ViewController , funciona perfectamente.
  • Cuando UIAlertDelegation método UIAlertDelegation ...didDismissWithButtonIndex... funciona sin delegación.
  • Cuando configuro el UIAlertView delegate en nil : funciona sin delegación.

¿Alguna pista de lo que está mal?

En este método:

 - (void)viewDidLoad { DataModel *dataModel = [[DataModel alloc] init]; [dataModel ShowMeAlert]; [super viewDidLoad]; } 

está asignando una variable local de DataModel que será desasignada por ARC al final del scope. Por lo tanto, cuando se ejecuta el rechazo, su delegado ya no está allí. La solución para esto es almacenar su DataModel en una propiedad strong de su controller de vista. De esta forma no será desasignado. Lo haría:

 - (void)viewDidLoad { self.dataModel = [[DataModel alloc] init]; [self.dataModel ShowMeAlert]; [super viewDidLoad]; }