2010-02-28 3 views
1

J'ai un UITableView qui affiche diverses nsstrings à partir d'un objet personnalisé appelé "Transaction". dans CellForRowAtIndexPath, il alloue une nouvelle instance d'une transaction, puis copie les valeurs d'une transaction particulière qui réside dans le tableau des délégués afin que je puisse y accéder à partir de différentes vues. Il utilise ensuite la nouvelle transaction 'copy' et ses propriétés pour remplir la cellule du tableau. Le problème que j'ai est que si je libère l'objet de transaction copié quand je vais réafficher la table l'application se bloque. si je commente la sortie, le programme fonctionne bien, mais je m'inquiète évidemment de la gestion de la mémoire. Ma question est de savoir ce que je devrais faire, y a-t-il un autre endroit où publier cela?CellForRowAtIndexPath Causant des problèmes, quand puis-je libérer un local à l'intérieur?

Voici le code:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"TransCell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} 

// Set up the cell... 
NSUInteger row = [indexPath row]; 
CashAppDelegate *mainDelegate = [(CashAppDelegate *) [UIApplication sharedApplication] delegate]; 


Transaction *cellTrans = [[Transaction alloc] init]; 


cellTrans = [mainDelegate.transactionArray objectAtIndex:row]; 

NSString *string = [NSString stringWithFormat:@"$%1.2f %@ | %@", cellTrans.amount, cellTrans.category, cellTrans.descriptionString]; 
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

cell.text = string; 
//[cellTrans release]; 
return cell; 
} 

Répondre

2

Vous n'avez pas réellement besoin d'allouer un nouvel objet Transaction vu que vous voulez seulement/avez besoin d'une référence à celui qui existe déjà dans votre tableau de transactions délégué. Ainsi, au lieu de:

Transaction *cellTrans = [[Transaction alloc] init]; 
cellTrans = [mainDelegate.transactionArray objectAtIndex:row]; 

et le nettoyage avec

[cellTrans release]; 

juste obtenir une référence avec celui-ci ligne:

Transaction *cellTrans = (Transaction *)[mainDelegate.transactionArray objectAtIndex:row]; 
+0

Merci qui a travaillé, d'apprécier l'aide! – nickthedude

2

Vous voulez:

Transaction *cellTrans = [mainDelegate.transactionArray objectAtIndex:row]; 

au lieu de:

Transaction *cellTrans = [[Transaction alloc] init]; 


cellTrans = [mainDelegate.transactionArray objectAtIndex:row]; 

Ensuite, vous aurez pas besoin de la libération. Le problème est cellTrans est un pointeur. Qu'est-ce que vous avez fait est de créer un nouvel objet, pointez sur lui, puis pointez sur quelque chose d'autre en ignorant l'objet que vous venez de faire. Ensuite, vous essayez de vous débarrasser de l'objet dans le tableau plutôt que celui que vous venez de créer.

Questions connexes