Утечка памяти в loadNibNamed? - PullRequest
       18

Утечка памяти в loadNibNamed?

6 голосов
/ 29 октября 2009

Я собираюсь завершить свое первое приложение для iPhone и решил, что я запустил его с помощью Leaks Performance Tool. После исправления одного очевидного, единственное, что у меня осталось, это тот, у которого Nib действует как представление заголовка таблицы, загруженное через loadNibNamed (здесь я следил за демонстрацией Recipes).


- (void)viewDidLoad {
    [super viewDidLoad];

    if (self.tableHeaderView == nil) {
        [[NSBundle mainBundle] loadNibNamed:@"TableHeaderView" owner:self options:nil];
        self.tableView.tableHeaderView = self.tableHeaderView;
    }
}

Тогда в dealloc:


- (void)dealloc {
    [tableHeaderView release];
    [super dealloc];
}

Instruments сообщает мне, что я пропускаю 256 байтов с двумя утечками, поступающими из строки с loadNibNamed. tableHeaderView - единственный объект верхнего уровня в Nib (я проверял это в отладчике). Есть что-то, что я забыл выпустить? Я неправильно истолковываю то, что говорят мне инструменты? Это неправильно? Это то, что ОС будет очищать позже?

Ответы [ 2 ]

5 голосов
/ 01 ноября 2009

При загрузке пера вы отвечаете за освобождение всех объектов верхнего уровня в файле пера. Есть ли что-нибудь в этом файле, кроме TableHeaderView?

2 голосов
/ 29 октября 2009

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

Кроме того, в Dellloc, не будет ли [self.tableHeaderView release]? Вы должны соответствовать своему использованию.

Чтобы избежать путаницы, в вашем .h вы должны заявить следующее:

NS/UI/??xxxxxx *_MyObjectName;   //notice the underscore

Тогда свойство вот так:

@property .... NS/UI/??xxxxxx *MyObjectName;   //no underscore

Затем синтезируйте геттеры / сеттеры следующим образом:

@synthesize MyObjectName=_MyObjectName;

Наконец, обратитесь к объекту в программе с помощью [self.MyObjectName ...];

...