Функция использует много памяти - PullRequest
0 голосов
/ 05 сентября 2011

У меня есть функция, которая вызывается кнопкой в ​​ячейке табличного представления, после 15-20 вызовов этой функции (15 - 20 нажатий на кнопку) я получаю предупреждение памяти уровня 2.Без этой функции я, похоже, не получаю эту ошибку.

Я прочитал всю "ответственность за память", которая идет с разработкой приложений для iPhone, но моя неопытность мешает мне реализовать это в моей функциипоэтому я надеюсь, что кто-то там мог бы взглянуть на это и посмотреть, что может высосать всю память.

Функция (отредактировано: "(int) sender" -> "(id) sender ") :

- (void)addPoint:(id)sender {
if ([sender tag] == 0) {
    [playerOneScore replaceObjectAtIndex:holeNum withObject:[NSNumber numberWithInt:[[playerOneScore objectAtIndex:holeNum] intValue] + 1]];
} if ([sender tag] == 1) {
    [playerTwoScore replaceObjectAtIndex:holeNum withObject:[NSNumber numberWithInt:[[playerTwoScore objectAtIndex:holeNum] intValue] + 1]];
} if ([sender tag] == 2) {
    [playerThreeScore replaceObjectAtIndex:holeNum withObject:[NSNumber numberWithInt:[[playerThreeScore objectAtIndex:holeNum] intValue] + 1]];
} if ([sender tag] == 3) {
    [playerFourScore replaceObjectAtIndex:holeNum withObject:[NSNumber numberWithInt:[[playerFourScore objectAtIndex:holeNum] intValue] + 1]];
}
[tbl reloadData];
}

Буду признателен за любые указания о том, как освободить часть памяти из моей функции, функция бесполезна в том виде, в котором она сейчас себя ведет.

Примечание: я пробовал [button release], но это только создает ошибки и, похоже, не помогает моей ситуации с памятью.

Заранее спасибо, Тобиас Товедал

РЕДАКТИРОВАТЬ: cellForRowAtIndex:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];


if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}

[cell.detailTextLabel setText:[NSString stringWithFormat:@"%@", [players objectAtIndex:indexPath.row]]];
[cell.textLabel setFont:[UIFont systemFontOfSize:50]];

UIButton *plusBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
plusBtn.frame = CGRectMake(255, 5, 60, 70);
[plusBtn setTitle:@"+" forState:UIControlStateNormal];
[plusBtn.titleLabel setFont:[UIFont systemFontOfSize:25]];
[plusBtn addTarget:self action:@selector(addPoint:) forControlEvents:UIControlEventTouchUpInside];

UIButton *minusBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
minusBtn.frame = CGRectMake(190, 5, 60, 70);
[minusBtn setTitle:@"-" forState:UIControlStateNormal];
[minusBtn.titleLabel setFont:[UIFont systemFontOfSize:25]];
[minusBtn addTarget:self action:@selector(removePoint:) forControlEvents:UIControlEventTouchUpInside];

plusBtn.tag = indexPath.row;
minusBtn.tag = indexPath.row;

if (indexPath.row == 0) {
    [cell.textLabel setText:[[playerOneScore objectAtIndex:holeNum] stringValue]];
} if (indexPath.row == 1) {
    [cell.textLabel setText:[[playerTwoScore objectAtIndex:holeNum] stringValue]];
} if (indexPath.row == 2) {
    [cell.textLabel setText:[[playerThreeScore objectAtIndex:holeNum] stringValue]];
} if (indexPath.row == 3) {
    [cell.textLabel setText:[[playerFourScore objectAtIndex:holeNum] stringValue]];
}

[cell.contentView addSubview:plusBtn];
[cell.contentView addSubview:minusBtn];

return cell;
}

Ответы [ 3 ]

3 голосов
/ 05 сентября 2011

Каждый раз, когда вы обращаетесь к ячейке таблицы в cellForRowAtIndexPath:, вы добавляете подпредставления minusBtn и plusBtn.

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

0 голосов
/ 05 сентября 2011

Вы создаете и добавляете как подпредставления plusBtn и minusBtn каждый раз, когда вызывается метод относительно ячейки, повторно используемой или нет.Добавление в качестве подпредставления каждый раз без удаления предыдущего приводит к утечке.Попробуйте это:

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];

   UIButton *plusBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
   plusBtn.frame = CGRectMake(255, 5, 60, 70);
   [plusBtn setTitle:@"+" forState:UIControlStateNormal];
   [plusBtn.titleLabel setFont:[UIFont systemFontOfSize:25]];
   [plusBtn addTarget:self action:@selector(addPoint:) forControlEvents:UIControlEventTouchUpInside];

   [cell.contentView addSubview:plusBtn];

   // do the same for minusBtn here
}
0 голосов
/ 05 сентября 2011

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

[cell.contentView addSubview:plusBtn];
[cell.contentView addSubview:minusBtn];

внутри блока:

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}

Редактировать: Клаус был быстрее

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