在我的应用中,用户必须通过在表格视图中输入答案来回答给定问题。我有一个表视图,从一个自定义单元格开始,用户输入一些数据。该单元格有一个可以加载另一个自定义单元格的按钮,用户可以在其中输入更多数据。
一旦用户回答了问题,就会修改表格视图,使其只有第一个单元格用于新问题。此外,清除所有对象的几个“数据”数组,包括负责跟踪用户输入的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];
}
}
答案 0 :(得分:1)
调用retain
会增加对象的保留计数。当您首次使用[NSObject alloc]
创建对象时,保留计数设置为1.调用retain
会增加计数,使其变为2.调用release
,另一方面,减少保留计数因此,假设您对保留计数为1的对象调用release
,它变为0.当它为0时,对象从内存中释放(并调用dealloc
)。
我希望这能使事情变得清晰,内存管理非常混乱。您可能希望稍后在项目中查看testing for memory leaks。
祝你好运。