我有一个函数,在一个表视图单元格中被一个按钮调用,在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;
}
答案 0 :(得分:3)
每次访问cellForRowAtIndexPath:
中的表格单元格时,您都会添加minusBtn
和plusBtn
子视图。
您应该重新排列代码,以便这些子视图仅在创建时添加到单元格中。现在,如果重新使用按钮,则会添加新按钮,因此已经包含这些视图。
答案 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)
每次调用方法时,您都要创建并添加子视图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
}