将NSDictionary对象设置为子视图中的属性要么在未释放时泄漏,要么在释放时出现EXC_BAD_ACCESS错误

时间:2011-08-24 14:46:21

标签: ios memory-leaks nsarray nsdictionary exc-bad-access

我有以下问题:在某个视图控制器中,我有一个NSDictionary,它本身就是NSArray对象中的一个主进程。此视图控制器具有子视图,该视图显示此字典中的一些键值对。因为我只需要一些键值对,所以我构造了一个新的字典对象,然后从中删除了我不想要的键值对。为了能够在子视图中访问这个字典,我虽然可以通过属性设置字典,这似乎工作正常。用一些代码说明:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    ...

    // today is an instance of NSArray holding a number of NSDictionary objects
    NSDictionary *completeData = [self.today objectAtIndex:row];
    NSDictionary *data = [[NSDictionary alloc] initWithDictionary:completeData];
    [data removeObjectForKey:@"name"];

    SomeViewController *childController = [[SomeViewController alloc] init];
    childController.data = data;

    [self.navigationController pushViewController:childController animated:YES];
    [childController release];

    // This results in a EXC_BAD_ACCESS error when navigating back to the parent 
    // view and calling didSelectRowAtIndexPath a second time. When commenting this 
    // line out, the error dissapears, but now the object leaks
    [data release];
}

当返回到父视图后,我尝试通过调用

来替换NSArray对象(今天)的更新版本。
- (void)refreshDataNotification:(NSNotification *)notification {
    if (notification) {
        self.today = [NSArray arrayWithArray:[[[MyAppDelegate getAppDelegate] todaySchedule]  
            objectForKey:@"data"]];
        [self.tableView reloadData];
    }
} 

请注意,只要我不在didSelectRowAtIndexPath中释放'data',我就不会收到错误,但是对象会泄漏。当我释放它时,我会在执行refreshDataNotification时收到EXC_BAD_ACCESS。

如果有人知道我可能做错了什么,那么请与我分享。

1 个答案:

答案 0 :(得分:0)

将环境变量NSZombieEnabled设置为YES,以获取有关过度释放对象的更多有用错误消息。 (通过查看“可执行文件”下的详细信息设置环境变量)

此外,了解您如何定义属性会很有帮助。 (例如dataSomeViewController的@property是什么?)

ps - 我知道您没有粘贴实际代码,但dataNSDictionary的可怕实例名称。 dict更好 - 但更具描述性的内容会让您的代码更容易理解。