Cela devrait poser un problème de gestion de la mémoire.
Considérez cette déclaration:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellTableIdentifier];
Selon le Cocoa memory management rule, ce n'est pas une méthode alloc
/new
/copy
, à savoir que vous ne possédez pas le cell
, vous devriez donc pas -release
après la fin En l'utilisant. Cependant, la déclaration suivante (en supposant cell != nil
):
return [cell autorelease];
fera le cell
être libéré (un peu plus tard), provoquant une double sortie de la cellule (un peu plus tard). Par conséquent, vous devriez simplement return cell;
.
Maintenant, que faire si cell == nil
? A l'intérieur de la branche if
, vous avez écrit
cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellTableIdentifier];
Depuis le cell
est créé avec alloc
, vous êtes responsable de -release
il. Mais puisque vous allez le rendre à d'autres, vous devez renoncer à la propriété tout en évitant qu'il soit désaffecté immédiatement. C'est là que -autorelease
est utilisé, pour transférer temporairement la propriété à un "pool de libération automatique" afin que l'autre code puisse avoir une chance de reprendre la propriété (-retain
) avant qu'il ne soit vidé dans le vide. Dans les autres termes, remplacez cette instruction par cell = [[[...] autorelease];
.
De même, vous devriez -release
le label
car c'est -alloc
-ed et vous n'êtes plus le propriétaire. Cependant, vous n'avez pas besoin de -autorelease
car vous êtes sûr qu'il existe déjà un autre propriétaire (cell.contentView
).
Pour résumer, vous devez réécrire le code comme:
static NSString *CellTableIdentifier = @"CellTableIdentifier ";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellTableIdentifier];
if (cell == nil)
{
cell=[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellTableIdentifier] autorelease];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 5, 70, 15)];
[email protected]"Name:";
[cell.contentView addSubview:label];
[label release];
}
return cell;
BTW, vous pouvez utiliser UITableViewCellStyleValue2
(comme le carnet d'adresses) pour éviter de jouer avec la hiérarchie de la vue.
Parce que quelque chose ne va pas. (Fournissez des détails si vous voulez de bonnes réponses.) – kennytm
Vous pouvez certainement! Si vous avez des problèmes avec votre code ici - il est vraiment impossible de vous aider sans le voir. – Vladimir
Eh bien, il ne peut pas mettre à jour la question avec plus d'informations si vous les gars le fermer :) – willcodejavaforfood