Как исправить EXC_BAD_ACCESS на свойстве NSArray? - PullRequest
1 голос
/ 21 мая 2011

Это еще один вопрос 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 Ответ

1 голос
/ 21 мая 2011

Единственный раз, когда вам нужно освободить объект, это если вы явно выделили его в виде new, alloc или copy.

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] возвращает ожидаемое значение, заключается в том, что массив все еще удерживает ссылки, которые были освобождены.

...