在iOS中向上滚动tableView(当一个单元格消失时)时的Exc_bad_access

时间:2012-08-21 10:14:19

标签: iphone ios ios5 uitableview exc-bad-access

我正在使用启用了ARC的Xcode 4.4.1和故事板(如果这会产生影响)

我有一个带有表视图的UITableViewController(表视图使用“subtitle”单元格)

我正在使用NSArray来填充我的表格:

@property (strong, nonatomic) NSArray *myData;

我在viewDidLoad

中获取此表中的数据
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.myData = [self.myCalendarModel GetWeightHistory] ;
}

然后我有:numberOfSectionsInTableView和numberOfRowsInSection

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.myData count];
}

最后是我的cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"WeighDataCell";
    UITableViewCell *cell = [tableView
                         dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    WeightHistory *myDataForCell = [self.myData objectAtIndex:indexPath.row];

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"dd.MM.YYYY"];
    NSString *dateString = [dateFormat stringFromDate:myDataForCell.weightDate];

    cell.textLabel.text = dateString;
    cell.detailTextLabel.text = [myDataForCell.weight description];

    return cell;
} 

我可以毫无问题地展示我的桌子。我有空间显示6个细胞,我的NSArray有6个记录。当我向下滚动桌子时,我没有任何问题。

当我向上滚动时,如果没有单元格离开视图,我没有问题。当我释放手指时,只要一个单元格不在视图中,我就会收到Exc_bad_access错误。

当使用NSZombieEnable进行调试时,我可以看到:

[CalendarHistoryTableViewController tableView:cellForRowAtIndexPath:]: message sent to deallocated instance 0x6eaf6f0

所以我猜我的细胞被释放了,这就是我遇到这个问题的原因。但我不知道何时以及如何防止这种情况。

感谢您提供的任何帮助! 埃里克

@FaddishWorm 是标识符已设置,如果单元格不是nil则表示已分配。但是这部分似乎有效,因为我可以将我的数据提升到屏幕。

@Pandey_Laxman 感谢您的评论。这是我在这堂课里唯一的代码。要检查问题是否与我的WeightHistory对象无关我从代码中删除了这部分,但我仍然得到相同的错误

这是我的新cellForRowAtIndexPath的样子:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"WeighDataCell";
    UITableViewCell *cell = [tableView
                         dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    cell.textLabel.text = @"test";
    cell.detailTextLabel.text = @"test2";
    return cell;
}

1 个答案:

答案 0 :(得分:2)

我明白了。

我的TableViewController被另一个ViewController中的segue显示在屏幕上,我没有将当前TableViewController指针存储在`强大的属性中。

因此,当iOS尝试在cellForRowAtIndexPath上调用TableViewController时,它无法通知,因为它已经被释放。

感谢您的帮助。

此致,Eric