2010-03-01 5 views
3

J'ai un UITableView à l'intérieur d'un UITabBarController.EXC_BAD_ACCESS lors de l'appel de pushViewController

Quand j'appelle

[[self navigationController] pushViewController:myViewController animated:YES]; 

il n'y a pas de problème.

Mais, quand je vous appelle la même ligne à l'intérieur d'un UIActionSheetDelegate, par exemple:

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex 

je reçois EXC_BAD_ACCESS.

Il semble que l'appel de cette ligne à partir d'un autre thread à l'origine de ce problème.

Comment puis-je éviter ce problème EXC_BAD_ACCESS?

(notez que MyViewController est pas nul, ou quelque chose comme ça)

merci!

+1

Pouvez-vous s'il vous plaît poster tout le code que vous avez pour actionSheet: clickedButtonAtIndex afin que nous puissions mieux vous aider avec votre problème? – Convolution

+0

Lorsque vous avez cette erreur avez-vous ouvert le debbuger (gdb) pour mettre au point quelle est l'instruction qui provoque cette erreur? Pourriez-vous poster les détails ici s'il vous plaît? –

+0

appelant à: [[auto navigationController] pushViewController: myViewController animé: OUI]; provoquant l'erreur – taxman

Répondre

4

EXC_BAD_ACCESS est levée lorsque vous essayez d'accéder à un objet libéré et actionSheet:clickedButtonAtIndex: est appelé sur le thread principal, après que la feuille d'action est rejetée, alors je devine ce qui fait par myViewController est libéré.

Il ne doit pas être nil, en fait, c'est le problème. L'objet pointé est libéré, mais le pointeur n'est pas nil.

+0

tnx. L'UIActionSheet est appelée depuis une classe appelée: MainRootViewController myViewController est un membre de cette classe. Le code complet est: - (void) actionSheet: (UIActionSheet *) actionSheet clickedButtonAtIndex: (NSInteger) buttonIndex {\t MyViewController = [[MyViewController alloc] init]; \t [[auto navigationController] pushViewController: myViewController animé: OUI]; \t } – taxman

+0

pouvez-vous voir pourquoi j'ai cette erreur EXC_BAD_ACCESS? – taxman

0

tnx.

Le UIActionSheet est appelé à partir d'une classe appelée: MainRootViewController

MyViewController est membre dans cette classe (MainRootViewController).

Le code complet est:

-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 

myViewController = [[myViewController alloc] init]; 

[[self navigationController] pushViewController:myViewController animated:YES]; 

} 
+0

Êtes-vous sûr que c'est votre vrai code? parce que vous appelez alloc sur un pointeur, pas une classe. –

+0

non, mon erreur. la ligne est: myViewController = [[MyViewController alloc] init]; – taxman

1

Je viens d'avoir le même problème et le mien était que je n'assine le varible membre avec moi quand je il ventilés entre.

Ce causeed un problème: (myTestViewController est le membre de la classe)

TestViewController* test = [[TestViewController alloc] init]; 
    myTestViewController = testViewController; 
    [testViewController release]; 
     [[self navigationController] pushViewController:myTestViewController animated:YES]; 

Mais quand je change et le membre de assied classe avec moi cela a fonctionné.

TestViewController* test = [[TestViewController alloc] init]; 
    self.myTestViewController = testViewController; 
    [testViewController release]; 
     [[self navigationController] pushViewController:myTestViewController animated:YES]; 
1

J'ai eu un problème similaire. La façon dont je l'ai réparé était en supprimant self.navigationController.delegate = self; de mon contrôleur de vue poussé.

Questions connexes