2010-11-19 4 views
0

J'ai un NSMutableArray je suis en train de recharger après un appel asynchrone. La première fois, il charge comme ceci:iOS - la réinitialisation de tableau NSMutable provoque une panne

self.sessionProcList = [NSMutableArray arrayWithArray:[result records]]; 

Après que l'utilisateur fait une certaine interaction, sera atteint la même ligne pour recharger le NSMutableArray. Cela provoque le crash

fichier d'en-tête a:

@interface... 
NSMutableArray *sessionProcList; 
... } 

@property (nonatomic, retain) NSMutableArray *sessionProcList; 
+1

ce qui est l'accident? –

+0

êtes-vous sûr que vous devriez utiliser nonatomic dans ce cas? –

+0

Je ne suis pas sûr, pour être honnête. J'ai cherché un bon exemple de réutiliser un NSMutableArray et de réinitialiser la valeur entre les opérations w/pas de chance. C'est un écran assez simple. Juste recharge les valeurs du tableau. Quel serait le moyen le plus simple de déclarer cela? Au lieu de l'approche que j'utilise. L'approche que j'ai fonctionne bien pour un singleton synchronisé, mais ne semble pas fonctionner dans une seule classe d'interface. –

Répondre

0

Si je devais deviner, je dirais que les éléments dans ce tableau sont référencés ailleurs. La réinitialisation du tableau entraîne le blocage des éléments utilisant les références.

Je voudrais vérifier votre demande d'autres variables, des propriétés ou des éléments de l'interface utilisateur à l'aide de ces variables qui n'ont pas été communiqué avant de le réinitialiser.

+0

Merci jocull! Je pense que je ne vais peut-être pas vraiment savoir où le publier. J'ai quelques-uns de ces types d'appels aux éléments dans le tableau. ZKSObject * tmpSessionProc = [self.sessionProcList objectAtIndex: indexPath.row]; Si je publie cela, je reçois un message d'erreur "message envoyé à l'instance désaffectée". Qu'est-ce que je rate? Merci encore! –

+0

Je ne pense pas que vous ayez besoin de libérer * tmpSessionProc parce que vous n'avez pas alloué cette variable là. Il est référencé à partir de self.sessionProcList, donc si vous le libérez à * tmpSessionProc, vous le libérez aussi dans self.sessionProcList. Vous pouvez essayer de déboguer en utilisant la console de développeur dans XCode avec quelque chose comme NSLog ("Retain count:% i", [tmpSessionProc retainCount]); – jocull

1

Dites que vous faites:

NSMutableArray *a = [NSMutableArray arrayWithObject: [[NSObject alloc] init]]; 
NSObject *o = [a objectAtIndex: 0]; 
[a removeAllObjects]; 
[o description]; // *BOOM* 

La volonté ci-dessus - accident [généralement parfois, mais seulement par hasard] parce que o a été désallouée au moment où la méthode description est invoquée.

Si vous avez une référence à un objet dans un tableau, mais n'ont pas retenu ladite référence, alors que ledit objet peut être libérée de sous-vous lorsque vous videz le tableau.

(Et nonatomic par rapport atomique est hors de propos.)

+0

Est-ce que [[NSObject alloc] init] ne provoque pas de retenue? – joshpaul

0

Parce que arrayWithArray est une méthode pratique, il s'initialisés avec un drapeau autorelease.

Vous ne l'avez pas mentionné ce que le message accident/d'erreur est mais je devine votre NSMutableArray est d'être libérés avant votre deuxième iteraction avec elle commence.

Essayez et de conserver le tableau aussi longtemps que vous besoin avec:

self.sessionProcList = [NSMutableArray arrayWithArray:[result records]]; 
[sessionProcList retain]; 

Et puis relâchez quand vous en avez terminé:

[sessionProcList release]; 

J'espère que ça aide. Rog

+0

Si vous utilisez la propriété, qui est une propriété retain, vous n'avez pas besoin de la conserver à nouveau. Ce n'est pas le problème qui cause le crash. – JeremyP

Questions connexes