2011-01-20 2 views
1

Je crée une application pour iPad. Dans celui-ci, j'ai un ITUabBarController mis en place qui montre 3 vues. Voir 1, Voir 2, et Voir 3. Tout cela fonctionne très bien. Sur la vue 1, l'utilisateur crée une commande. Ils font ensuite toucher un bouton qui construit la commande. Ceci est montré dans une vue modale qui permet à l'utilisateur de l'examiner avant de l'envoyer. Ils peuvent soit «soumettre» ou «modifier» l'ordre, de toute façon, je rejette le modal et retourne à View 1. Cela fonctionne bien aussi. Mais si l'utilisateur touche à nouveau le bouton de commande "make", cette fois le chargement de la vue modale provoque un plantage "EXC_BAD_ACCESS". J'ai copié le code tout comme je l'ai fait pour une autre vue modale dans l'application, qui n'a aucun problème à se montrer maintes et maintes fois. Je suis assez perplexe à ce stade et j'apprécierais toute aide. Merci. Le code d'appel modal est:L'appel à presentModalViewController provoque "EXC_BAD_ACCESS"

-(IBAction) makeOrder { 

    NSMutableArray *orderItems = [[NSMutableArray alloc] init]; 
    //code that populates orderItems array - removed for brevity 

    NSLog(@"order items count:%d", [orderItems count]); 

    // Create the modal view controller 
    PartsOrderViewController *modalController = [[PartsOrderViewController alloc] initWithNibName:@"PartsOrderView" bundle:nil]; 

    //this is the only difference b/w this and the other modal view. The other 
    //modal presents as a formsheet 
    modalController.modalPresentationStyle = UIModalPresentationFullScreen; 
    modalController.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 

    modalController.orderList = orderItems; 
    modalController.storeId = selectedCustomer.storeID; 
    modalController.customerInfo = customerInfo.text; 
    modalController.customerTamsId = selectedCustomer.customerTAMSID; 


    // show the Controller modally -- This is the line that cause the error after the second time 
    [self presentModalViewController:modalController animated:YES]; 

    // Clean up resources 
    [modalController release]; 
} 

Il se fait dans le viewDidLoad du modal, mais tombe en panne dès que son exécution est terminée.

Voici le code pour le modal:

#import "PartsOrderViewController.h" 


@implementation PartsOrderViewController 

@synthesize customerTamsId; 
@synthesize customerInfo; 
@synthesize invoiceDate; 
@synthesize invoiceTime; 
@synthesize storeId; 

@synthesize customerInfoLabel; 
@synthesize invoiceDateLabel; 
@synthesize invoiceTimeLabel; 
@synthesize storeIdLabel; 

@synthesize orderList; 

@synthesize delegate; 

#pragma mark - 
#pragma mark View methods 

-(IBAction) editOrder { 
    [self dismissModalViewControllerAnimated:YES]; 
} 

-(IBAction) submitOrder { 
    //code removed for brevity 
} 


#pragma mark - 
#pragma mark View implementation methods 

// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. 
/* 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization. 
    } 
    return self; 
} 
*/ 


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.customerInfoLabel.text = self.customerInfo; 
    self.storeIdLabel.text = self.storeId; 
    self.invoiceDateLabel.text = self.invoiceDate; 
    self.invoiceTimeLabel.text = self.invoiceTime; 

} 



- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    // Overriden to allow any orientation. 
    return NO; 
} 


- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc. that aren't in use. 
} 


- (void)viewDidUnload { 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 


- (void)dealloc { 
    [super dealloc]; 
} 


@end 

MISE À JOUR: Solution trouvée: Code Outrage est marqué comme such-

-(NSMutableArray *)buildOrderList { 

     NSMutableArray *orderItems = [[NSMutableArray alloc] init]; 
     id cellObject = NULL; 
     int counter = 0; 
     NSEnumerator *theEnum = [self.partsList objectEnumerator]; 
     while((cellObject = [theEnum nextObject]) != NULL) 
     { 
      GridTableCell *cell = (GridTableCell *)[self.partsListGrid cellForRowAtIndexPath:[NSIndexPath indexPathForRow:counter inSection:0]]; 
      UILabel *lineAbbrev = (UILabel *)[cell.contentView.subviews objectAtIndex:0]; 
      UILabel *partNo = (UILabel *)[cell.contentView.subviews objectAtIndex:1]; 
      UITextView *orderQty = (UITextView *)[cell.contentView.subviews objectAtIndex:3]; 
      //NSLog(@"OrderQty length: %d", [orderQty.text length]); 
      //NSLog(@"Part#:%@, OrderQty:%@", partNo.text, orderQty.text); 

      PartOrderIn *invItem = [[PartOrderIn alloc] init]; 
      invItem.lineAbbrev = lineAbbrev.text; 
      invItem.partNumber = partNo.text; 
      invItem.orderQty = orderQty.text; 
      invItem.partMessage = @""; 

      if ([invItem.orderQty length] > 0) { 
       [orderItems addObject:invItem]; 
      } 


      counter++; 
      [invItem release]; 

//The following three lines is what was killing it 
      //[lineAbbrev release]; 
      //[partNo release]; 
      //[orderQty release]; 

     } 

     //NSLog(@"order items count:%d", [orderItems count]); 
     return orderItems; 
} 

Répondre

1

Au risque d'énoncer l'évidence (désolé;) avez-vous franchi le débogueur? Un mauvais accès est probablement un problème d'allocation de mémoire (encore une fois, mr évident). Comment sont définies les propriétés (orderList est-il conservé? Autres propriétés?). Vérifiez où se trouvent les plantages et notez les valeurs de vos propriétés, soit en utilisant Expressions dans le débogueur ou par adresse mémoire. Ma conjecture est quelque chose n'est pas retenu que vous assumez est retenu.

+0

Effectivement, c'était une chose de la mémoire. Je viens d'un arrière-plan C# & VB et je n'ai pas encore complètement compris comment gérer la mémoire dans iOS. Le code incriminé était dans le code I laissé pour la brièveté, ne pensant pas qu'il était peut-être même arrivé là. Eh bien, c'était. :) Je suis en train de mettre à jour mon message original avec le bit de code où l'erreur se produisait. Merci de votre aide – Shaggy13spe

0

Rien ne saute immédiatement (le problème est plus que probable le code que vous avez supprimé pour la brièveté) mais avez-vous essayé d'activer les zombies? How to enable zombies. Cela vous donnera généralement une indication de l'auteur de l'infraction ou au moins vous donne un aperçu de l'endroit où chercher ...

+0

Merci, je l'ai fait et voici ce que je reçois: - [CALayer layerDidBecomeVisible:]: message envoyé à l'instance désaffectée 0x61683b0 Mais qu'est-ce que cela signifie pour moi? Désolé, je suis un noob. Programmeur .NET récemment converti, et je suis habitué à voir toute trace de pile lorsqu'une exception se produit. Est-ce possible en XCode? BTW, si cela aide, en passant par le code, il souffle après l'exécution de viewDidLoad de la vue modale. – Shaggy13spe

+0

Ok, voici une chose encore plus bizarre ... Au lieu d'afficher une vue modale, (juste pour le plaisir de tester), View 1, affiche maintenant un UIAlertView. Il montrera avec succès, deux fois mais après la troisième fois, kaboom! – Shaggy13spe

+0

Effectivement, c'était une chose de la mémoire. Je viens d'un arrière-plan C# & VB et je n'ai pas encore complètement compris comment gérer la mémoire dans iOS. Le code incriminé était dans le code I laissé pour la brièveté, ne pensant pas qu'il était peut-être même arrivé là. Eh bien, c'était. :) Je suis en train de mettre à jour mon message original avec le bit de code où l'erreur se produisait. Merci pour votre aide, et merci pour l'astuce sur les zombies, je n'avais jamais entendu parler de ça. – Shaggy13spe

Questions connexes