Где утечка памяти? - PullRequest
       3

Где утечка памяти?

0 голосов
/ 16 ноября 2010

Я добавляю настраиваемое представление в tableHeaderView со следующим кодом:

imageButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    imageButton.frame = CGRectMake(120, 12, 64, 64);
    imageButton.titleLabel.font = [UIFont systemFontOfSize:10];
    imageButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
    imageButton.titleLabel.textAlignment = UITextAlignmentCenter;
    [imageButton setTitle:NSLocalizedString(@"Choose\nPhoto", @"Choose\nPhoto") forState:UIControlStateNormal];
    [imageButton addTarget:self action:@selector(photoButtonPressed) forControlEvents:UIControlEventTouchUpInside];

    // add existing image, if any, to button
    if (child.thumbnailImage != nil) {
        [imageButton setBackgroundImage:child.thumbnailImage forState:UIControlStateNormal];
    }

    // add button to view
    self.headerView = [[UIView alloc] initWithFrame:CGRectMake(22, 12, 70, 70)];
    [headerView addSubview:imageButton];

    // add view to table header
    self.tableView.tableHeaderView = headerView;

Утечка памяти отображается в строке выделения выше для headerView UIView. Я объявляю UIView и UIButton в заголовочном файле и освобождаю их в ViewDidUnload и dealloc, так что я не уверен, что делаю неправильно. Кроме того, это отображается только на устройстве, а не на симуляторе (я думал, что упомяну).

Любая помощь будет оценена.

Спасибо

Rod

1 Ответ

1 голос
/ 16 ноября 2010

Вы используете метод установки headerView (self.headerView), поэтому вам нужно освободить экземпляр UIView, который вы назначаете свойству headerView, используя release или autorelease.

, например

UIView* newHeaderView = [[UIView alloc] initWithFrame...];
self.headerView = newHeaderView;
[newHeaderView release];

или

self.headerView = [[[UIView alloc] initWithFrame:...] autorelease];

Причина в том, что метод установки headerView автоматически сохраняет назначенный ему объект.

В качестве альтернативы, вы можете установить переменную экземпляра headerView напрямую, без использования метода установки свойств:

[headerView release]; // release any existing object
headerView = [[UIView alloc] initWithFrame:...];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...