1

Pour définir cell.textLabel.text dans la méthode cellForRowAtIndexPath, j'alloue et init une chaîne. Si je libère cette chaîne après avoir défini cell.textLabel.text, alors le programme va se bloquer après avoir fait cela plusieurs fois.NSString n'a pas besoin d'être libéré dans cellForRowAtIndexPath: méthode?

Pourquoi ne plante-t-il pas la première fois? Puisque la chaîne a été allouée et initialisée, ne doit-elle pas être libérée?

Voici le code:

NSString *cellText = [[NSString alloc] init]; 
    cellText = [NSString stringWithFormat:@"(%.1f points", totalpoints]; 
    if (showNumberOfPlayers) { 
     cellText = [cellText stringByAppendingFormat:@", %i players) ", [[playerArray objectAtIndex:indexPath.row] count]]; 
    } 
    else { 
     cellText = [cellText stringByAppendingString:@") "]; 
    } 

    cell.textLabel.text = [cellText stringByAppendingString:teamList]; 
    [cellText release]; 
+0

Afficher le code – willcodejavaforfood

Répondre

4

Un malentendu classique de gestion de la mémoire.

Vous alloccellText dans la première ligne de code, mais remplacez-le dans la deuxième ligne. Donc maintenant vous n'avez pas accès à l'objet original, et vous libérez l'objet autoreleased, ce qui conduit à un crash.

La même chose dans les instructions if, où vous redéfinissez la valeur. Dans cette situation, j'utiliserais un objet NSString normal, autoreleased, mais vous pouvez également utiliser un NSMutableString que vous libérez vous-même (mais alors vous devrez ajuster au code pour faire usage des méthodes NSMutableString, telles que appendFormat: au lieu de stringByAppendingFormat:)

NSString *cellText = [NSString stringWithFormat:@"(%.1f points", totalpoints]; 

Cette fois, vous ne alloc la chaîne vous-même, de sorte que vous n'avez pas à le libérer. Lorsque vous remplacez la variable, il n'y a pas de problème car la valeur précédente sera auto-libérée.

Questions connexes