Dans une application iPhone, je développe, j'attrape un ensemble de données d'un service Web, les stocke dans une matrice mutable pour les afficher dans un tableau et les stocke également dans des données de base en tant que sauvegarde. il n'y a pas de réseau.NSMutableArray devenant nul après reloadData
Mon tableau est initialisé en application: didFinishLaunchingWithOptions: comme suit
tableArray = [[NSMutableArray alloc] initWithCapacity:100];
le tableau est ensuite rempli après viewDidLoad est appelée, ce qui signifie la UITableView EXISTE (vérifié par le débogueur contrôle), et juste avant reloadData est appelé, je NSLog imprimer le contenu de la matrice, et bien sûr tout est là.
Mon problème est que après reloadData est appelé, tableArray devient null, comme indiqué par un NSLog dans tableView: numberOfRowsInSection :. Je ne comprends pas pourquoi cela se produit, même si je ne fais que programmer Cocoa depuis quelques mois et que je pourrais facilement manquer quelque chose d'évident.
EDIT: mise à jour avec le code de base.
@interface MyAppDelegate : NSObject {
...
NSMutableArray *tableArray;
}
@property (nonatomic, retain) NSMutableArray *tableArray;
...
@end
@implementation MyAppDelegate
@synthesize tableArray
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
tableArray = [[NSMutableArray alloc] initWithCapacity:100];
masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:[NSBundle mainBundle]];
[masterViewController.tableView setDelegate:self];
[masterViewController.tableView setDataSource:self];
...
}
Une méthode appelée runWithNetwork est alors appelé à viewDidLoad masterViewController:
- (void)runWithNetwork {
...
NSArray *backpackArray = [[mainDict objectForKey:@"items"] objectForKey:@"item"];
NSLog(@"%i", [backpackArray count]);
for (int a=0; a<[backpackArray count]; a++) {
NSDictionary *itemDict = [backpackArray objectAtIndex:a];
NSString *ID = [[itemDict valueForKey:@"defindex"] stringValue];
NSString *level = [[itemDict valueForKey:@"level"] stringValue];
NSString *quality = [[itemDict valueForKey:@"quality"] stringValue];
NSString *inventory = [[itemDict valueForKey:@"inventory"] stringValue];
NSNumber *uid = [NSNumber numberWithInt:a];
//Insert new
myItem = [NSEntityDescription insertNewObjectForEntityForName:@"Backpack" inManagedObjectContext:managedObjectContext_];
[myItem setValue:level forKey:@"level"];
[myItem setValue:inventory forKey:@"inventory"];
[myItem setValue:quality forKey:@"quality"];
[myItem setValue:uid forKey:@"uid"];
//Link to item db
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id == %@", ID];
[fetch setEntity:[NSEntityDescription entityForName:@"GlobalItems" inManagedObjectContext:managedObjectContext_]];
[fetch setPredicate:predicate];
item = [[managedObjectContext_ executeFetchRequest:fetch error:nil] objectAtIndex:0];
[myItem setValue:item forKey:@"item"];
[tableArray addObject:[item valueForKey:@"name"]]; //a series of nsstrings
}
NSLog(@"%@, %i", tableArray, [tableArray retainCount]); // all strings are printed correctly here, retaincount is 1
[masterViewController.tableView reloadData];
}
Puis je vais à mes méthodes de table:
- (NSInteger)tableView:(UITableView *)tView numberOfRowsInSection:(NSInteger)section {
NSLog(@"%@, %i", tableArray, [tableArray retainCount]); //(null) printed, 0 for retaincount
return [tableArray count]; //returns 0
}
La tableView se trouve dans le fichier xib de MasterViewController et y est liée correctement. Il est seulement décrit dans MasterViewController et est configuré comme un IBOutlet. tableArray est uniquement décrit dans MyAppDelegate.h et n'est pas recréé ailleurs.
Il est très étrange que votre variable devient spontanément 'nil'. Avez-vous essayé d'exécuter votre programme avec Guard Malloc (menu Exécution -> Activer Guard Malloc) pour voir si vous avez un voerflow tampon quelque part? – zneak
Essayé juste maintenant, et je suppose que quelque chose trouvé par GuardMalloc serait imprimé dans la console? Dans ce cas, tout va bien, je reçois les messages de bienvenue de GM, puis tout est imprimé par NSLog comme avant. – MattMcN
Il y a quelques possibilités qui me viennent à l'esprit, mais il est difficile de trouver quelque chose avec une vague description de la façon dont le code fonctionne. Voir le code (ou une version réduite qui présente toujours le problème) faciliterait la déduction. – Chuck