29 votes

Bug iOS 7 ou mon bug dans UIAlertView

J'ai obtenu la trace de pile suivante lorsque mon application se bloque en tapant sur "OK" sur une UIAlertView. Est-ce ma faute ou un bug d'iOS7 ? Je ne sais pas comment résoudre ce problème.

OS Version:          iOS 7.0 (11A465)
Report Version:      104

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x00000000
Triggered by Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libobjc.A.dylib                 0x39d50b36 objc_msgSend + 22
1   UIKit                           0x3212e3da -[UIAlertView(Private) modalItem:shouldDismissForButtonAtIndex:] + 58
2   UIKit                           0x31ed2036 -[_UIModalItemsCoordinator _notifyDelegateModalItem:tappedButtonAtIndex:] + 90
3   UIKit                           0x31ed1f3e -[_UIModalItemAlertContentView tableView:didSelectRowAtIndexPath:] + 890
4   UIKit                           0x31dd7326 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1074
5   UIKit                           0x31e8a24e -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 210
6   UIKit                           0x31d3a96e _applyBlockToCFArrayCopiedToStack + 314
7   UIKit                           0x31cb246e _afterCACommitHandler + 426
8   CoreFoundation                  0x2f5141d2 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 18
9   CoreFoundation                  0x2f511b74 __CFRunLoopDoObservers + 280
10  CoreFoundation                  0x2f511eb6 __CFRunLoopRun + 726
11  CoreFoundation                  0x2f47cce2 CFRunLoopRunSpecific + 518
12  CoreFoundation                  0x2f47cac6 CFRunLoopRunInMode + 102
13  GraphicsServices                0x3417727e GSEventRunModal + 134
14  UIKit                           0x31d1ea3c UIApplicationMain + 1132
15  MyApp                           0x000d8e5e 0xcb000 + 56926
16  libdyld.dylib                   0x3a25dab4 start + 0

Code de la vue d'alerte

UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Error"
    message:[NSString stringWithFormat:@"Es ist ein Fehler aufgetreten: %@", [error localizedDescription]]
    delegate:self
    cancelButtonTitle:@"OK"
    otherButtonTitles:nil];
[av show];

et je n'ai pas défini de méthode de délégation.

17voto

Johannes Bauer Points 493

Stupide, il me suffit d'attribuer la valeur nil au délégué de la vue d'alerte.

13voto

user1628587 Points 101

Parce que le délégué du UIAlertView est une propriété d'affectation dans UIAlertView . Je pense que c'est la faute d'Apple. Ce devrait être un point faible dans l'ARC. Mais il s'agit d'une propriété d'assignation, vous devez donc définir le délégué de la vue d'alerte à nil avant de détruire le délégué (la plupart du temps, une classe de contrôleur est renvoyée ou navigue vers l'arrière). Lisez le fichier .h pour UIAlertView En ce qui concerne le délégué, vous pouvez constater qu'il s'agit d'une propriété assignée et que quelqu'un a commenté après la déclaration en disant "//weak reference" (référence faible).

5voto

malex Points 2992

La meilleure façon d'éviter les problèmes avec UIAlertView lors de l'utilisation de la délégation est de de faire de l'instance de UIAlertView un iVar pour la classe déléguée. Ensuite, il faut faire en sorte que la propriété delegate de alertView soit nil dans le dealloc de la classe delegate.

@implementation YOUR_CLASS
{
    UIAlertView *_alert;
}

- (void)dealloc
{
    _alert.delegate = nil;
}

- (void)showAlertView
{
    _alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
}

La même approche est suffisante pour toutes les anciennes classes avec des délégués de type assigné.

0voto

user1013544 Points 19

Si vous devez spécifier un délégué, vous pouvez également effectuer une "libération automatique" de la vue d'alerte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X