Вызывает ли [[NSBundle mainBundle] loadNibNamed: owner: options:] утечки памяти при использовании для загрузки пользовательских ячеек таблицы? - PullRequest
0 голосов
/ 16 августа 2011

В настоящее время я создаю пользовательские ячейки табличного представления для iPhone, используя [[NSBundle mainBundle] loadNibNamed: owner: option:] для загрузки пера.При профилировании приложения происходит утечка памяти каждый раз, когда я открываю представление с помощью этих пользовательских ячеек таблицы.Инструменты утечки указывают мне на строку [[NSBundle mainBundle] loadNibNamed: owner: option:].Вот мой код:

static NSString *challengeCellIdentifier = @"challengeListTableCell";

//NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
ChallengeListTableCell *cell = (ChallengeListTableCell *) [tableView dequeueReusableCellWithIdentifier:challengeCellIdentifier];
if (cell == nil) {
    NSArray *topLevelObjects = [[NSBundle mainBundle] 
                                loadNibNamed:@"ChallengeListTableCell" 
                                owner:nil options:nil];

    for (id currentObject in topLevelObjects) {
        if([currentObject isKindOfClass:[ChallengeListTableCell class]]){
            cell = (ChallengeListTableCell *) currentObject;
            break;
        }
    }
}

// Configure the cell...
if(indexPath.row == 0){     // top
    [cell.backgroundImg setImage:[UIImage imageNamed:@"topMenuBar.png"]];
    [cell.selectedBackgroundImg setImage:[UIImage imageNamed:@"topMenuBarOn.png"]];
}else if(indexPath.row == [challenges count]-1){    //bottom
    [cell.backgroundImg setImage:[UIImage imageNamed:@"bottomMenuBar.png"]];
    [cell.selectedBackgroundImg setImage:[UIImage imageNamed:@"bottomMenuBarOn.png"]];
}else{                              //middle
    [cell.backgroundImg setImage:[UIImage imageNamed:@"middleMenuBar.png"]];
    [cell.selectedBackgroundImg setImage:[UIImage imageNamed:@"middleMenuBarOn.png"]];
}


if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { //ipad
    [cell.title setFont:[UIFont fontWithName:@"MuseoSans-500" size:40.0f]];
}else{  //iphone
    [cell.title setFont:[UIFont fontWithName:@"MuseoSans-500" size:20.0f]];
}

Challenge * challenge = [challenges objectAtIndex:indexPath.row];
[cell.title setText:challenge.title];
if([challenge.completed boolValue]){
    [cell.checkImage setImage: [UIImage imageNamed:@"checkComplete.png"]];
} else {
    [cell.checkImage setImage: [UIImage imageNamed:@"checkNotComplete.png"]];
}

return cell;

Документация гласит, что массив, возвращенный из loadNibNamed: owner: options: это объект с автоматическим выпуском, поэтому я не понимаю, почему это вызывает утечку.У кого-нибудь еще была такая проблема?

Ответы [ 2 ]

1 голос
/ 16 августа 2011

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

0 голосов
/ 16 августа 2011

Похоже, плохой дизайн ...

Если табличное представление не может перезапустить ячейку, вы загружаете NIB ... Это неправильно, потому что NIB может быть загружен, даже если элемент не может быть переработан.

Затем вы предполагаете, что ваш цикл for получит действительный экземпляр. Нет проверки ошибок. Плохо ...

Наконец, вы выделяете пул авто-релиза (не знаю почему в таком случае). Вы просто забыли выпустить его.

...