如何在不获取EXC_BAD_ACCESS的情况下访问cellForRowAtIndexPath中的数组

时间:2013-01-30 23:18:28

标签: objective-c ios5 uitableview

我有一个让我发疯的错误。我有NSArray个问题。该阵列由JSON响应填充。我正在尝试使用它来填充表格视图。

在我的头文件中我正在定义像这样的问题

@interface OneViewController : UITableViewController <MBProgressHUDDelegate> {
    NSArray *questions;
    MBProgressHUD *HUD;
}

@property (nonatomic, strong) NSArray *questions;

在我的实现中,我像这样实例化

@synthesize questions;

当视图加载时,我正在调用这个函数来ping我的JSON服务

- (void) pullQuestions {
    NSMutableDictionary *viewParams = [NSMutableDictionary new];
    [viewParams setValue:@"questions" forKey:@"view"];
    [PythonView viewGet:viewParams success:^(AFHTTPRequestOperation *operation, id responseObject) {
        questions = responseObject;
        NSLog(@"Qestions: %@", responseObject);
        [self.tableView reloadData];
        [HUD hide:YES];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        //ALog(@"Failure: %@", [error localizedDescription]);
    }];
}

当我收到回复时,我会找出响应对象,这是一个正确格式化的JSON响应。

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"VideoFeedCell";
        NSInteger count = [questions count];
        NSLog(@"Count: %i", count);
        for (int i = 0; i < count; i++) {
            NSString* body = [questions objectAtIndex:i];
            NSLog(@"Object: %@", body);
        }
    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"VideoFeedCell" owner:self options:nil];
        // Grab a pointer to the first object (presumably the custom cell, as that's all the XIB should contain).
        cell = [topLevelObjects objectAtIndex:0];   
    }
    return cell;
}

因此,当我循环执行此操作时,问题计数为4并且数组中的第一个对象被追踪(为空)。第二次尝试执行for循环时,我得到EXC_BAD_ACCESS。它几乎就像问题阵列消失了。最奇怪的是我在另一个项目中使用几乎完全相同的代码,它工作正常。我甚至使用我在其他项目中使用的相同JSON服务来测试它(所以我知道它没有格式错误或者什么)我仍然得到这个错误。我真的卡住了,我觉得它必须要么保存作为一个数组的JSON响应或者它自己被释放的数组的奇怪之处。

2 个答案:

答案 0 :(得分:0)

假设您没有使用ARC,我怀疑问题是您是将responseObject直接分配给questions实例变量而不是通过属性。这意味着您没有获得responseObject的所有权,并且在刷新自动释放池时它将被释放。

尝试更改:

questions = responseObject;

为:

questions = [responseObject retain];

或:

self.questions = responseObject;

并查看是否可以解决问题。

答案 1 :(得分:0)

问题与ARC有关。我开始使用一些旧的锅炉板代码(我曾经建造过的一个带标签的导航项目)。并试图改造它。我没有注意到一个项目战争ARC而另一个项目没有战斗的事实。