2010-11-10 6 views
0

Je suis relativement nouveau dans la programmation iOS mais avec beaucoup d'expérience en programmation dans d'autres langages, principalement en C# et en Java. J'essaie de faire quelque chose comme une galerie de photos avec des catégories spécifiques pour certains produits pour un appareil iPad. L'interface utilisateur est assez simple faite à partir d'un "écran de sélection" (FirstViewController, voir ci-dessous) et "Galerie". L'écran de sélection contient 2 UITableViews, master et detail qui affiche les catégories de produit et les sous-catégories, respectivement. Lorsque l'utilisateur fait la sélection, il tape une "voir l'image" button et les images sont affichées en mode défilement dans "Galerie". "Galerie" est un fichier XIB séparé qui est présenté de manière modale. Tout fonctionne bien. Mais, chose étrange se produit lorsque l'utilisateur bascule entre "Galerie" et "écran de sélection". Et la chose étrange est que cela arrive exactement au 4ème "commutation" entre eux. Je continue à recevoir le message:iPad: Numéro UITableView

- [FirstViewController tableView: didSelectRowAtIndexPath:]: message envoyé à l'instance désallouées 0x4b1f9f0"

Ensuite, le programme se bloque ... j'ai mis NSAutoreleaseFreedObjectCheckEnabled, NSZombiesEnabled et NSDebugEnabled et toujours pas de description plus. Même « Garde malloc » n'a pas aidé.

Je comprends cela comme une question de mémoire mais ne sais pas pourquoi? fonctionne parfaitement 3 fois, mais pas le 4ème.

Heres la partie du code qui provoque des problèmes:


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    //check which table (master or detail) row is clcked then perform click event 
    if(tableView.tag == 0){ 
     //populate list of brands using predefined function 
     [self populateBrandNames:(int)indexPath.row]; 

     //reload data 
     [detail reloadData]; 

     //4 a good UI experience we'll remove any previous picture loaded into brandImage 
     bUserSelected = false; 
     [brandImage setBackgroundImage:nil forState:UIControlStateNormal]; 
    }else{ //the detail table sent event 
     NSIndexPath *master_row, *details_row; 

     //get selected rows 
     master_row = [master indexPathForSelectedRow]; 
     details_row = [detail indexPathForSelectedRow]; 

     NSString *logoName = [[NSString alloc] initWithFormat:@"%02d%02d_logo", (int)master_row.row, (int)details_row.row]; 
     NSString *path = [[NSBundle mainBundle] pathForResource:logoName ofType:@"jpg"]; 

     //check if we have path to resource (if logo exsist) 
     if(path != nil){ 
      UIImage *logo = [[UIImage alloc] initWithContentsOfFile:path]; 

      //display selected logo 
      bUserSelected = true; 
      [brandImage setBackgroundImage:logo forState:UIControlStateNormal]; 
      NSLog(@"brandImame set"); 

      //set current galery tag 
      [currentGaleryTag setString:@""]; 
      [currentGaleryTag appendFormat:@"%02d%02d", (int)master_row.row, (int)details_row.row]; 
      [logo release]; 
     }else{ 
      NSLog(@"logo not loaded, galery tag : %@, category name : %@", logoName, [detail cellForRowAtIndexPath:details_row].textLabel.text); 
     } 

     [logoName release]; 
    } 
} 

Merci à l'avance!

Répondre

1

Après un certain temps je pensais à ce qui est l'origine du problème ...

Le point est que dans cette application particulière de la « Gallery » est appelée de façon modale. Apple suggère que lorsque vous utilisez des vues modales, l'appelant (vue principale qui gère l'affichage) doit également prendre soin de rejeter la même vue. La meilleure méthode à utiliser dans ce scénario est l'utilisation du protocole "personnalisé" qui décrit un delegate et quelque chose comme une méthode viewWillBeDismissed.

Dans mon code que l'on ressemble à ceci:

@protocol ModalViewControllerDelegate 

- (void)didDismissModalView; 

@end 

@interface Galery : UIViewController { 
    //outlets declaration 
    ... 

    //some other declarations here... 

    //delegate reference 
    id delegate; 
} 

//outlets and views properties 
@property (nonatomic, assign) id delegate; 

@end 

Ce qui est été la cause du problème est cette ligne:

@property (nonatomic, assign) id delegate;

La chose « seulement » qui aurait besoin d'être changé est ce

@property (nonatomic, retain) id delegate;

Conserver une référence de délégué est ce qui est en train de résoudre un problème été ...

À la votre!