UITableView viewForHeaderInSection - автоматически выпущенное представление завершает работу приложения - PullRequest
0 голосов
/ 14 января 2012

У меня есть UIViewController, который реализует UITableViewDelegate и UITableViewDataSource. Я настраиваю заголовки разделов, используя метод viewForHeaderInSection:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

UILabel *label = sectionHeaderLabel();

switch (section) {
    case 0:
        label.text = @"";
        break;
    case 1:
        label.text = @"Points";
        break;
    case 2:
        label.text = @"Problems";
        break;
    default:
        label.text = @"";
        break;
}

// Create header view and add label as a subview
UIView *view = [[UIView alloc] initWithFrame:CGRectZero];
[view addSubview:label];
[label release];

return view;

}

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

Что с этим?

Ответы [ 2 ]

0 голосов
/ 14 января 2012

Вам необходимо ознакомиться с правилами управления памятью , прежде чем приступить к дальнейшей разработке - это избавит вас от многих неприятностей.

Clang (не компилятор) жалуется, потому что вы возвращаете +1 сохраненный объект (непревзойденный init) из метода, имя которого указывает, что он возвращает автоматически выпущенный объект.

Затем (как утверждает Ник) вы, вероятно, возвращаете автоматически освобожденный объект из sectionLabelHeader (). Таким образом, чрезмерное сохранение «представления» скрывает чрезмерное сохранение «ярлыка».

Наконец, почему вы используете функцию C для возврата UILabel *? Это законно AFAIK, но довольно неортодоксально. Меня не удивит, если это подстегнет и Кленга. Это, безусловно, вызовет проблемы, если / когда вы перейдете на автоматический подсчет ссылок (ARC). Я бы порекомендовал вам вместо этого использовать метод или метод класса, если вы собираетесь на фабрику.

0 голосов
/ 14 января 2012

Возможно, проблема связана с меткой, а не с представлением.

Возвращает ли метод sectionHeaderLabel () объект автоматически выпущенной метки?Если это так, вы не должны явно выпускать ярлык после добавления его в качестве подпредставления для просмотра.

Попробуйте удалить [выпуск метки];и возвращаемся [просмотреть авто-релиз];

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