如何在NSArray属性上修复EXC_BAD_ACCESS?

时间:2011-05-21 07:05:42

标签: objective-c ios nsarray exc-bad-access

这是另一个EXC_BAD_ACCESS问题。虽然我完成了我的作业,但我确信我并没有过度释放我的NSArray。

所以这是我的代码片段:

tableData = [NSDictionary dictionaryWithJSONString:JSONstring error:&error];
//Collect Information from JSON String into Dictionary. Value returns a mutli 
dimensional NSDictionary. Eg: { value => { value => "null"}, etc }

NSMutableArray *t_info = [[NSMutableArray alloc] init];
for(id theKey in tableData)
{
    NSDictionary *get = [tableData objectForKey:theKey];
    [t_info addObject:get];
    [get release];
} // converting into an NSArray for use in a UITableView

NSLog(@"%@", t_info);
//This returns an Array with the NSDictionary's as an Object in each row. Returns fine

if (tvc == nil)
{
    tvc = [[tableViewController alloc] init]; //Create Table Controller
    tableView.delegate = tvc;
    tableView.dataSource = tvc;
    tvc.tableView = self.tableView;
    tvc.tableData = t_info; //pass our data to the tvc class
    [tvc.tableView reloadData];
}
...

现在在我的TableViewController类中:

@implementation tableViewController
@synthesize tableData, tableView;

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{
    return [tableData count]; //Returns X Amount Fine.
}

- (UITableViewCell *)tableView:(UITableView *)the_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    NSString *MyIdentifier = [NSString stringWithFormat:@"MyIdentifier"];

    UITableViewCell *cell = [the_tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
    }

    NSLog(@"%@", tableData); //** CRASHES!!**
    cell.textLabel.text = @"This is a test";
    return cell;
}

如果我要注释掉NSLog,它会正常工作并在每个表格行上返回“这是一个测试”。

这个真的让我感到难过,关于这个问题的所有文章都与保留/记忆问题有关。

另外,另一个重点。 如果我从我的第一个类代码中传递我的原始(NSDictionary)tableData并在我的tableViewController中运行相同的脚本 - 我可以非常好地NSLog该对象。

1 个答案:

答案 0 :(得分:1)

您需要释放对象的唯一时间是您已通过newalloccopy明确分配对象。

NSMutableArray *t_info = [[NSMutableArray alloc] init];
for(id theKey in tableData)
{
    NSDictionary *get = [tableData objectForKey:theKey];
    [t_info addObject:get];
    [get release];
}

你不应该在这里发布get。通过执行此操作,您将释放tableData字典所持有的引用,这很糟糕。我的猜测是,这就是造成你遇到问题的原因。

如果我没有弄错,[tableData count]返回预期值的原因是因为数组仍然保留已释放的引用。