Задача C: Как устранить утечку в коде (результаты из прибора) - PullRequest
3 голосов
/ 04 июля 2011

Я запустил инструменты для своего приложения (которое содержит UITableView) и получил следующие результаты

Ячейка будет вызывать метод [UICustomButton SetButtonWithAnswer ....] каждый раз, когда ячейка становится видимой

РЕДАКТИРОВАТЬ: Добавлено больше скриншотов

enter image description here

enter image description here enter image description here enter image description here enter image description here

Проблема в том, что я не уверен, что именно является причиной утечки. я выпустил все мои выделения ресурсов в коде. Почему это все еще протекает?

Буду очень признателен за любые советы!

EDIT:

Я добавил пользовательские кнопки следующим образом

if (cell == nil)
{
    cell = [[[CustomCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:PlaceholderCellIdentifier] autorelease];
    //Add like button
    UICustomButton *likeButton = [[UICustomButton alloc]init];
    likeButton.tag = 7;

    //Add comment button
    UICustomButton *commentButton = [[UICustomButton alloc]init];
    commentButton.tag = 8;

    //Add answer too button
    UICustomButton *answerButton = [[UICustomButton alloc]init];
    answerButton.tag = 9;

    [self.contentView addSubview:likeButton];
    [self.contentView addSubview:commentButton];
    [self.contentView addSubview:answerButton];

    [likeButton release];
    [commentButton release];
    [answerButton release];
}


//Set like button
UICustomButton *thisLikeButton = (UICustomButton *)[self.contentView viewWithTag:7];
[thisLikeButton setButtonWithAnswer:self.answerForCell buttonType:@"like" navcon:self.navcon andFrame:CGRectMake(CELL_TEXT_LEFT_MARGIN, totalCommentLabelHeight + CELL_SPACING*4, 45, CELL_BUTTON_HEIGHT)];
thisLikeButton.imageView.image = [UIImage imageNamed:@"heart.png"];


//Set comment button
UICustomButton *thisCommentButton = (UICustomButton *)[self.contentView viewWithTag:8];
 [thisCommentButton setButtonWithAnswer:self.answerForCell buttonType:@"comment" navcon:self.navcon andFrame:CGRectMake(CELL_TEXT_LEFT_MARGIN + 45 + 5, totalCommentLabelHeight + CELL_SPACING*4, 80, CELL_BUTTON_HEIGHT)];
thisCommentButton.imageView.image = [UIImage imageNamed:@"chat.png"];

//Set answer button
UICustomButton *thisAnswerButton = (UICustomButton *)[self.contentView viewWithTag:9];    
[thisAnswerButton setButtonWithAnswer:self.answerForCell buttonType:@"join in" navcon:self.navcon andFrame:CGRectMake(1.5*CELL_TEXT_LEFT_MARGIN + 45 + 5 + 80 + 5, totalCommentLabelHeight + CELL_SPACING*4, 60, CELL_BUTTON_HEIGHT)];
thisAnswerButton.imageView.image = [UIImage imageNamed:@"beer-mug_white.png"];

Ответы [ 3 ]

2 голосов
/ 04 июля 2011

Если я правильно понимаю ваш код, вам нужна отдельная копия вашей пользовательской кнопки для каждого из слов «лайк», «комментарий» и «присоединиться»?Тогда я думаю, что вы добавляете слишком много пользовательских кнопок: они добавляются, если cell = nil.UITableView создает ячейку для каждой видимой строки, так что копий каждой из них будет столько же, сколько видимых строк.

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

Далее, как насчет получателей self: answerForCell, navcon и answer.likers: есть ли открытые хранилища?

2 голосов
/ 05 июля 2011

Каждый alloc / init внутри setButton:… нуждается в переосмыслении. Вы не хотите воссоздать эти представления просто для установки значений.

if (self.imageView == nil) {
  UIImageView tempImageView = alloc/init …
  self.imageView = tempImageView;
  [tempImageView release];
}

self.imageView.image = self.image;

и то же самое для этикетки

1 голос
/ 04 июля 2011

это может быть еще ниже, но я не вижу выхода tempLabel.Вы действительно должны сказать нам, что течет.Вы должны быть в состоянии определить, является ли это ImageView, меткой и т. Д.

...