2013-03-11 1 views
0

Je suis en train de le délégué à un UIAlertView de la manière suivante:délégué UIAlertView écraser l'application

PhotoViewController *controller = [[PhotoViewController alloc] init]; 

UIAlertView *alert = [[UIAlertView alloc] 
         initWithTitle: @"Announcement" 
         message: @"It turns out that you are playing Addicus!" 
         delegate: controller 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:nil]; 
[alert show]; 

Où PhotoViewController est pas le UIviewContorller courant. Les charges d'alerte très bien, mais dès que j'appuie sur le bouton OK, les application se bloque et je reçois cette erreur:

0x3a61a5b0: LDR r3, [r4, # 8] EXC ACCESS BAD

Qu'est-ce que cela signifier?

EDIT:

+ (DejalActivityView *)activityViewForView:(UIView *)addToView withLabel:(NSString *)labelText width:(NSUInteger)aLabelWidth; 
{ 
// Immediately remove any existing activity view: 
if (dejalActivityView) 
    [self removeView]; 

// Remember the new view (so this is a singleton): 
dejalActivityView = [[self alloc] initForView:addToView withLabel:labelText width:aLabelWidth]; 

if ([labelText isEqualToString:@"Uploading photo (this process might take a while)"]) { 
buttonCancel = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
[buttonCancel addTarget:dejalActivityView 
       action:@selector(callCancelAlert:) 
     forControlEvents:UIControlEventTouchDown]; 
buttonCancel.frame = CGRectMake(230, 540, 265, 40); 
[addToView addSubview:buttonCancel]; 
[buttonCancel setImage:[UIImage imageNamed:@"socialize-navbar-bg.png"] forState:UIControlStateNormal]; 
[buttonCancel setTitle:@"Cancel upload" forState:UIControlStateNormal]; 
} 

return dejalActivityView; 
} 

-(IBAction)callCancelAlert:(id)sender{ 

PhotoViewController *controller = [[PhotoViewController alloc] init]; 

UIAlertView *alert = [[UIAlertView alloc] 
         initWithTitle: @"Announcement" 
         message: @"It turns out that you are playing Addicus!" 
         delegate: controller 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:nil]; 
[alert show]; 
//[alert release]; 
} 
+1

Est-ce une copie conforme de votre code? Si ce n'est pas le cas, et 'controller' est une propriété' weak', alors elle peut être nulle avant de pouvoir l'utiliser. Dans tous les cas, vérifiez si le contrôleur est non-nul dans le débogueur. Tout le meilleur – virtualnobi

+0

Oui, ceci est le code. Et c'est la seule référence que j'ai à controller, ainsi que #import "PhotoViewController" – Alessandro

+0

Indice: le délégué n'est pas retenu par alertView; –

Répondre

4

Les délégués ne sont pas des propriétés retenues. Cela signifie que lorsque controller sort du champ d'application, ARC le libère et, puisqu'il n'a pas été conservé par un autre objet, il sera libéré. Lorsque la vue d'alerte tente d'envoyer un message à son délégué, l'adresse n'est plus valide et vous obtenez une exception.

Le délégué de la vue d'alerte devra vivre plus longtemps que la vue d'alerte elle-même. Généralement, l'objet qui crée une vue d'alerte doit être le délégué. Vous devez déplacer le code de délégué dans la classe qui crée la vue d'alerte.

Questions connexes