1

Чтобы установить cell.textLabel.text в методе cellForRowAtIndexPath, я выделяю и запускаю строку. Если я выпущу эту строку после установки cell.textLabel.text, программа будет аварийно завершена после этого несколько раз.NSString не нужно выпускать в cellForRowAtIndexPath: метод?

Почему он не падает в первый раз? Поскольку строка была выделена и введена, не нужно ли ее освобождать?

Вот код:

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

Показать код пожалуйста – willcodejavaforfood

ответ

4

Классическим непонимание управления памятью.

Вы alloccellText в первой строке кода, но переопределите его во второй строке. Итак, теперь у вас нет доступа к исходному объекту, и вы отпускаете объект с автореализацией, что приводит к сбою.

То же самое в операциях if, где вы снова переопределяете значение. В этой ситуации я бы использовал обычный, автореализованный объект NSString, однако вы также можете использовать NSMutableString, который вы выпускаете самостоятельно (но тогда вам придется приспособиться к коду, чтобы использовать методы NSMutableString, такие как appendFormat: вместо stringByAppendingFormat:)

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

на этот раз вы никогда не alloc струна себя, так что вы не должны освободить его. Когда вы переопределяете переменную, проблема не возникает, поскольку предыдущее значение будет получать автореализацию.

Смежные вопросы