Потенциальная утечка памяти, и я не знаю почему - PullRequest
0 голосов
/ 18 ноября 2011

У меня есть следующий код, который добавляет метку в нижний колонтитул UITableView, чтобы я мог отформатировать текст (белый и т. Д.)

Работает нормально, но выдает предупреждение об утечке для headerLabel при анализе в строке с возвратом

        // create the parent view that will hold header Label
UIView* customView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 15.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 systemFontOfSize:14];
headerLabel.textAlignment=UITextAlignmentCenter;
headerLabel.frame = CGRectMake(10.0, 0.0, 300.0, 75.0);
headerLabel.numberOfLines=4;

if (section==0) {

    headerLabel.text = @"If turned off, the last used settings will be used on the next session\n\n"; // i.e. array element

}


[customView addSubview:headerLabel];

    //[headerLabel release];

return customView;
    // [customView release];

Я пытался выложить релиз тут и там, но он всегда один и тот же.

Буду признателен за отзывы, ребята.

Ответы [ 4 ]

1 голос
/ 18 ноября 2011
  1. Вы должны отпустить headerLabel перед выходом из метода:

    [headerView release];
    
  2. Возможно, вам следует автоматически выпустить customView, если имя вашего метода не содержит словnew, alloc или copy (в этом случае вызывающая сторона должна освободить возвращенное представление):

    return [customView autorelease];
    
1 голос
/ 18 ноября 2011

попробуй

[headerLabel release];
return [customView autorelease];
1 голос
/ 18 ноября 2011

автоматически выпустите ваш customView и убедитесь, что вы выпускаете headerLabel после добавления его в качестве подпредставления.Каждый раз, когда вы вызываете alloc / init, вы вступаете во владение, вам необходимо убедиться, что вы освободили эти объекты.Поскольку вы возвращаете customView из этого метода, имеет смысл отложить выпуск этого объекта (с помощью автоматического выпуска), чтобы он мог использоваться вызывающим объектом.

// create the parent view that will hold header Label
UIView* customView = [[[UIView alloc] 
                          initWithFrame:CGRectMake(0.0, 15.0, 300.0, 44.0)] 
                          autorelease];

// 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 systemFontOfSize:14];
headerLabel.textAlignment=UITextAlignmentCenter;
headerLabel.frame = CGRectMake(10.0, 0.0, 300.0, 75.0);
headerLabel.numberOfLines=4;

if (section==0) {
    headerLabel.text = @"If turned off, the last used settings will be used on the next session\n\n"; // i.e. array element
}

[customView addSubview:headerLabel];

[headerLabel release];

return customView;
0 голосов
/ 18 ноября 2011

Исходя из приведенного здесь примера кода, первый выпуск будет правильным.(Выпуск после оператора return не имеет смысла).Вы приобрели право собственности на объект при его создании, и вам нужно его освободить.

Вы можете использовать инструменты, чтобы отслеживать, где объект сохраняется и освобождается;Вы можете увидеть историю утечек, чтобы точно увидеть, что происходит.Это было бы вашим лучшим выбором здесь.Запустите приложение с помощью инструмента «Утечки», и, когда вы обнаружите объект утечки, щелкните стрелку справа от адреса.Это покажет вам историю объекта - каждое сохранение и освобождение.

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