重新加载表视图单元格时出现EXC_BAD_ACCESS错误

时间:2012-07-02 01:55:16

标签: objective-c uitableview nsarray

在我的应用中,用户必须通过在表格视图中输入答案来回答给定问题。我有一个表视图,从一个自定义单元格开始,用户输入一些数据。该单元格有一个可以加载另一个自定义单元格的按钮,用户可以在其中输入更多数据。

一旦用户回答了问题,就会修改表格视图,使其只有第一个单元格用于新问题。此外,清除所有对象的几个“数据”数组,包括负责跟踪用户输入的leftData.equation。 ([array removeAllObjects]

第二个单元格加载时没有崩溃,也没有返回下一个问题的第一个单元格。但是,当我再次尝试加载第二个单元格时,程序会因Bad Access而崩溃。我假设它与数组leftData.equation

有关

下面是第二个单元格加载时调用的方法

- (void) setUpBalanceCell: (UITableView *) tableView  {

    balanceCell = (BalanceCell *) [tableView dequeueReusableCellWithIdentifier:@"balanceCell"];

    if (balanceCell == nil) {   

        NSArray *nib =   [[NSBundle mainBundle] loadNibNamed:@"BalanceCell" owner:self options:nil];
        balanceCell = (BalanceCell*) [nib objectAtIndex:0];
        [balanceCell.rightButton addTarget:self action:@selector(test) forControlEvents:UIControlEventTouchUpInside];

    }
        // stores data from first cell into a data array
        for (FormulaLabel *label in equationCell.leftView.equationOrder) 
            [leftData.equation addObject:label.text];   //fix:  needs to comply with MVC   

        for (FormulaLabel *label in equationCell.rightView.equationOrder)  
            [rightData.equation addObject:label.text];  

        [leftData setUpBalancedEquation];
        [rightData setUpBalancedEquation];

        [self setUpView:balanceCell.leftView fromArray:leftData.equation toArray:leftBalanceItems]; // WHERE EXC_BAD ACCESS appears
        [self setUpView:balanceCell.rightView fromArray:rightData.equation toArray:rightBalanceItems];

}

调用错误访问的方法

- (void)setUpView:(UIView *)view fromArray:(NSMutableArray *)equationData toArray:(NSMutableArray *)balanceItems {

int labelCount = 0; //label #
int startingPoint = 5; //x vaiue where first label starts

//Crashes in method below
for (NSString *equationText in equationData) {

    //add text
    FormulaLabel *tempLabel = [[FormulaLabel alloc] initWithFrame:CGRectMake(startingPoint, 2, 10, 22)];
    tempLabel.text = equationText;
    [tempLabel sizeToFit];
    [view addSubview:tempLabel];
    tempLabel.tag = labelCount;
    [balanceItems addObject:tempLabel];
    //set location of '+'
    startingPoint = tempLabel.frame.origin.x + tempLabel.frame.size.width + 3;

    if (labelCount != [equationData count]-1) { //not the last label

        UILabel *plus = [[[UILabel alloc] initWithFrame:CGRectMake(startingPoint, 5, 10, 10)]autorelease];
        plus.text = @"+";
        plus.font = [UIFont systemFontOfSize:13];
        [plus sizeToFit];
        [view addSubview:plus];
        startingPoint = plus.frame.origin.x + plus.frame.size.width + 3;
        [balanceItems addObject:plus];
    }

    labelCount ++;
    [tempLabel release];
}

}

1 个答案:

答案 0 :(得分:1)

好吧,保留它肯定会修复它,但如果我是你,我会先调查阵列的发布位置。

调用retain会增加对象的保留计数。当您首次使用[NSObject alloc]创建对象时,保留计数设置为1.调用retain会增加计数,使其变为2.调用release,另一方面,减少保留计数因此,假设您对保留计数为1的对象调用release,它变为0.当它为0时,对象从内存中释放(并调用dealloc)。

我希望这能使事情变得清晰,内存管理非常混乱。您可能希望稍后在项目中查看testing for memory leaks

祝你好运。