2010-11-04 5 views
1

J'ai un NSMutableArray défini dans ma classe AppDelegate:Pourquoi ma variable est-elle hors de portée?

NSMutableArray *devices; 

Je remplir le tableau d'une classe dans la méthode didFinishLaunchingWithOptions:

Devices *devs = [[Devices alloc] init]; 
self.devices = [devs getDevices]; 

La méthode getDevices contenant une chaîne JSON et crée un objet périphérique , en l'ajoutant au tableau:

NSMutableArray *retDevices = [[NSMutableArray alloc] initWithCapacity:[jsonDevices count]]; 

for (NSDiectionary *s in jsonDevices) { 
    Device *newDevice = [[Device alloc] init]; 
    device.deviceName = [s objectForKey:@"name"]; 

    [retDevices addObject: newDevice]; 
} 

return retDevices; 

Puis j'utilise le tableau devices de la classe AppDelegate pour remplir une table Vue. Comme on le voit dans la méthode cellForRowAtIndexPath:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
Device *d = (Device *)[appDelegate.devices objectAtIndex:indexPath.row]; 

cell.label.text = d.deviceName; 

Lorsque le tableview est peuplé d'abord, il fonctionne. Mais lorsque je fais défiler la liste et que cellForRowAtIndexPath est à nouveau exécuté, d.deviceName renvoie une erreur car il est hors de portée.

Quelqu'un peut-il m'aider à comprendre pourquoi? Je suis sûr que ça a quelque chose à voir avec un article qui sort ... mais ... ??

Merci d'avance.

+0

Vous avez des fuites sur le tableau retDevices, qui n'est même pas déclaré correctement (vous avez oublié le *). De même, dans le deuxième bloc de code, vous semblez fuir l'objet devs. –

+0

Vous avez également des fuites de chaque nouveauDevice dans le tableau retDevices. –

+0

Le manquant * a été un oubli de ma part lors de la copie du code. Mon application a le * à cette déclaration. NewDevice devrait-il sortir à la fin de la boucle? – bugfixr

Répondre

4

S'il est en effet un problème avec la gestion de la mémoire, répondre à ces questions devraient vous conduire à une réponse:

  • est-deviceName déclarée comme une propriété retain ou copy par la déclaration d'interface Device?
  • Est-ce que -deviceName est synthétisé? Si non, comment est-il mis en œuvre?
  • Est-ce que devices est déclaré comme propriété retain par la déclaration d'interface de la classe de délégué d'application?
  • Est-ce que devices est synthétisé? Si non, comment est-il mis en œuvre?

Bien sûr, cela peut ne pas poser de problème avec la gestion de la mémoire. Cela aiderait beaucoup si vous fournissiez le texte réel du message d'erreur et tout backtrace fourni.

+0

deviceName a été déclaré comme @property (readwrite, assign, nonatomic) NSString * deviceName; Si je le change pour le conserver, à quel moment dois-je le libérer? – bugfixr

+1

Lorsque son propriétaire meurt, c'est-à-dire, l'objet 'Device'. Mettez '[deviceName release], deviceName = nil;' dans l'implémentation de '-dealloc' de' Device'. –

+0

ok, en ajoutant retenir à la déclaration des périphériques délégués semble avoir résolu cela. Quelqu'un peut-il m'aider à comprendre * pourquoi *?Sans retenir, la mémoire est-elle «libérée» par elle-même à un moment donné (un type de garbage collector?) Pourquoi cela fonctionne-t-il pour la première itération, mais échoue plus tard lorsque la liste est défilée? – bugfixr