Метод возвращает объект Objective C с счетом сохранения +1 - PullRequest
1 голос
/ 07 февраля 2012

Я получаю это, пока анализирую свой код:

Method returns an Objective-C object with a +1 retain count

и

Object leaked: object allocated and stored into 'headerLabel' is not referenced later in this execution path and has a retain count of +1

по этому методу:

 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
    {
        // create the parent view that will hold header Label
        UIView* customView = [[UIView alloc] initWithFrame:CGRectMake(15.0, 0.0, 300.0, 44.0)];

        // create the button object
        UILabel * headerLabel = [[UILabel alloc] initWithFrame:CGRectZero];
        headerLabel.backgroundColor = [UIColor clearColor];
        headerLabel.opaque = NO;
        headerLabel.textColor = [UIColor whiteColor];
        headerLabel.highlightedTextColor = [UIColor whiteColor];
        headerLabel.font = [UIFont boldSystemFontOfSize:15];
        headerLabel.frame = CGRectMake(10.0, 0.0, 300.0, 44.0);

        if (section == 0)
            headerLabel.text = NSLocalizedString(@"A", @"A");
        else if (section == 1) 
            headerLabel.text =NSLocalizedString(@"B", @"B");
        else if (section == 2)
            headerLabel.text = NSLocalizedString(@"C", @"C");

        if(searching)
            headerLabel.text = NSLocalizedString(@"SEARCH", @"Search Results");

        [customView addSubview:headerLabel];

        return customView;
    }

Теперь расширяемстрелки, которые я пытаюсь понять, и я предполагаю , что customView не освобождается.Это правильно?

Как я могу это исправить?Я новичок в этом, помогите мне понять!

Ответы [ 3 ]

5 голосов
/ 07 февраля 2012

Либо добавить

[headerLabel release];

после

[customView addSubview:headerLabel];

или инициализировать его так

UILabel * headerLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];

конечно, учитывая, что вы не используете ARC

1 голос
/ 07 февраля 2012
[customView addSubview:headerLabel];

после этой строки вы должны освободить переменную headerLabel.

Важно понимать концепцию владения объектом.В Objective C владельцем объекта является кто-то (или фрагмент кода), который прямо сказал: «Хорошо, мне нужен этот объект, не удаляйте его».Это может быть человек (или код), который создал объект.Или это может быть другой человек (или код), который получил объект и нуждается в нем.Таким образом, объект может иметь более одного владельца.Количество владельцев объекта также является счетчиком ссылок.

Взгляните на это Управление памятью с Objective C / Cocoa / iPhone .В своем коде вы создали headerLabel, поэтому вы являетесь владельцем этого объекта;Вы должны освободить этот объект.

0 голосов
/ 07 февраля 2012

headerLabel должен быть освобожден, а также, если ваш метод создает экземпляр и сохраняет его, его имя должно начинаться с «new», «copy» или «alloc»

...