NSString не должен быть освобожден в cellForRowAtIndexPath: метод? - PullRequest
1 голос
/ 10 октября 2010

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

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

Вот код:

    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];

1 Ответ

4 голосов
/ 10 октября 2010

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

Вы alloc cellText в первой строке кода, но переопределяете его во второй строке.Так что теперь у вас нет доступа к исходному объекту, и вы освобождаете автоматически выпущенный объект, что приводит к сбою.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...