【问题标题】:Getting EXC_BAD_ACCESS error when reloading a table view cell重新加载表格视图单元格时出现 EXC_BAD_ACCESS 错误
【发布时间】:2012-07-02 11:28:10
【问题描述】:

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

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

加载第二个单元格或返回第一个单元格进行下一个问题时都没有崩溃。但是,当我再次尝试加载第二个单元格时,程序会因访问错误而崩溃。我假设它与数组有关,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];
}

}

【问题讨论】:

  • 你在用NSZombieEnabled 构建吗?如果不这样做,看看你得到的错误。 stackoverflow.com/questions/2190227/…
  • 具体错误是 -[__NSArrayM countByEnumeratingWithState:objects:count:]: message sent to deallocated instance 0x60270f0 which was in for (NSString *equationText in equationData)
  • 不知道为什么说对象被释放了;就像我说的那样,我只打电话给[self.equation removeAllObjects] 或者那会释放对象吗?
  • no removeAllObjects 不会释放数组本身。您是否尝试过注释掉[self setUpView:balanceCell.leftView fromArray:leftData.equation toArray:leftBalanceItems]; 想知道您是否仍然在第二次调用rightData 时收到错误消息。检查一下,如果它没有崩溃,那么问题可能发生在其他地方,而不是上面提到的代码中。
  • 是的,我尝试将其注释掉;出现同样的错误。我会在上面添加更多代码

标签: objective-c uitableview nsarray


【解决方案1】:

好吧,保留它肯定会解决它,但如果我是你,我会首先查看数组的释放位置。

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

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

祝你好运。

【讨论】:

  • 我感到困惑的原因是我从未真正释放过数组。
  • 那就是它!释放 leftData 也会释放equation 数组。请记住,您将数组称为leftData.equation,即使在leftData 的dealloc 方法中没有释放方程(这将导致泄漏),释放leftData 意味着您不能再访问leftData.equation
  • 对不起,我更新了评论。原来我从来没有真正发布过leftData
  • 好吧,如果它花费太多时间,就让它保持原样。如果您发现内存管理过于混乱,您可以随时考虑使用 ARC 。我自己从来没有尝试过,虽然它应该让事情变得更容易。祝你好运!
猜你喜欢
  • 1970-01-01
  • 2010-11-12
  • 2019-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多