L'erreur dismissViewControllerAnimated sur ios5

Est-ce que le code plante, à cause d'une reference circulaire?

MenuController: UIViewController - (id)initWithNibName: {... TabsController *tabs = [[TabsController alloc] initWithNibName:@"TabsController" bundle:nil]; self.tab = tabs; .... } //button pressed: - (IBAction)showPrefFromMenu:(id)sender { // todo change delegate!? tab.tabDelegate = self; [self presentModalViewController:tab animated:YES]; //[tab release]; } // delegate method: -(void)myViewDismissed { .... NSLog(@"tab references: %d", [tab retainCount]) ; [self dismissModalViewControllerAnimated:YES];//crash ... } 

la class modale / enfant:

 TabsController : UIViewController <...> - (IBAction)dismissTabs:(id)sender { ... NSLog(@"dismissTabs: sender: %@",sender); [self.tabDelegate myViewDismissed]; } 

Comme je le vois le self.tabDelegate est l'instance de MenuController et sur ce code veut rejeter et désallouer le TabsController.

Bien que ce ne soit plus le code après [self.tabDelegate myViewDismissed]; mais s'il est impossible de l'exécuter, car il est désalloué, peut-être l'assemblage Ret ou quelle instruction ne peut pas être exécutée? la déclaration de return.

Je vais essayer de séparer le délégué ou une meilleure solution?

Edit: Le crash est typique: EXC_BAD_ACCESS (code = 1, adresse = 090) l'assemblage ressemble à ceci: ldr r1, [r4, r0]

Edit2: a changé un peu le code, car dans le simulateur 4.3 ne plante pas, mais à 5.0 il est, maintenant voici le code actuel:

 - (IBAction)showTab:(id)sender { tab.tabDelegate = self; if (SYSTEM_VERSION_LESS_THAN(@"5.0")) { [self presentModalViewController:tab animated:YES]; } else{ NSLog(@"Executing presentViewController (ios>= 5.0)"); [self presentViewController:tab animated:true completion: nil]; } } -(void)delegateCallback { if (SYSTEM_VERSION_LESS_THAN(@"5.0")) { [self dismissModalViewControllerAnimated:NO]; } else{ NSLog(@"Executing dismissViewControllerAnimated (ios>= 5.0)"); [self dismissViewControllerAnimated:TRUE completion: nil];//crash } } 

Capture d'écran Edit3:

discussions

Transition UIWindowController: fromViewController: toViewController: la ligne de didEndSeelctor plante, en raison de: non parentViewController: https://devforums.apple.com/message/451045 Les gars ont trouvé une solution ici: https://github.com/ideashower/ShareKit/ questions / 254 mais sous NDA

Edit résolu pour réécrire à PushviewController pour iOS 5.0 + un lien heplfull: https://stackoverflow.com/a/7767767/529543

 - (IBAction)presentViewController:(id)sender { tab.tabDelegate = self; if (SYSTEM_VERSION_LESS_THAN(@"5.0")) { [self presentModalViewController:tab animated:FALSE]; } else{ NSLog(@"Executing presentViewController (ios>= 5.0) [tab retainCount]: %d " ,[tab retainCount]); // store parent view to able to restore the state: parentView = self.view.superview; // init a navigation controler and set up: navigationController=[[UINavigationController alloc] initWithRootViewController:self]; [self.view removeFromSuperview]; [myAppDelegate.window addSubview:navigationController.view]; ///appDelegate is delegate of ur Application navigationController.navigationBar.hidden =true; [navigationController pushViewController:tab animated:YES]; } 

}

et popping:

 -(void)infoViewDismissed { if (SYSTEM_VERSION_LESS_THAN(@"5.0")) { [self dismissModalViewControllerAnimated:NO]; } else{ NSLog(@"Executing dismissViewControllerAnimated (ios>= 5.0) "); [navigationController popToRootViewControllerAnimated:false]; [navigationController.view removeFromSuperview]; [parentView addSubview:self.view]; } } 

J'ai résolu mon problème, dans un mode très laid, mais est fonctionnel … Également dit d'abandonner le support pour ios3 🙂 Je n'aime pas le commutateur d'architecture GUI à l'exécution du tout.

Votre question est un peu difficile à comprendre, mais je suppose que vous avez un cycle de rétention:

 ObjectA retains ObjectB ObjectB retains ObjectA 

et aucun object n'est désaffecté?

Votre propriété pour la tabDelegate devrait être:

 @property (nonatomic, assign) id tabDelegate; // ^^^^^^-This is the important bit, this stops the retain cycle. 

difficile à dire sans plus d'informations (utilisez-vous ARC, est-ce que vous retenez / assigné le délégué, etc …) mais par les docs iOS vous utilisez également des methods modalview obsolètes. Peut être utile d'essayer:

 [self presentViewController:tab animated:YES completion:NULL]; 

et

 [self dismissViewControllerAnimated:YES completion:NULL];