功能使用到很多内存

时间:2011-09-05 15:03:21

标签: iphone objective-c ios memory memory-management

我有一个函数,在一个表视图单元格中被一个按钮调用,在15-20调用该函数后(15 - 20点击一个按钮)我得到了一个2级内存警告。没有这个功能,我似乎没有得到这个错误。

我已经阅读了开发iPhone应用程序所带来的整个“内存责任”但我缺乏经验阻止我在我的功能上实现这一点,所以我希望那里有人可以看看它和看看可能会吸收所有的记忆。

功能(已编辑:“(int)sender” - >“(id)发件人”)

- (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]但这似乎只是创造了错误而且似乎并没有真正帮助我记忆的情况。

提前谢谢Tobias Tovedal

修改 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 个答案:

答案 0 :(得分:3)

每次访问cellForRowAtIndexPath:中的表格单元格时,您都会添加minusBtnplusBtn子视图。

您应该重新排列代码,以便这些子视图仅在创建时添加到单元格中。现在,如果重新使用按钮,则会添加新按钮,因此已经包含这些视图。

答案 1 :(得分:0)

每次显示单元格时都要添加plusBtn和minusBtn,而不删除它们。 尝试移动

[cell.contentView addSubview:plusBtn];
[cell.contentView addSubview:minusBtn];
块内的

代码:

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

编辑:克劳斯更快

答案 2 :(得分:0)

每次调用方法时,您都要创建并添加子视图plusBtnminusBtn,以便重用或不重用该单元格。每次添加为子视图而不删除前一个子视图导致泄漏。试试这个:

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
}