我有以下问题:在某个视图控制器中,我有一个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。
如果有人知道我可能做错了什么,那么请与我分享。
答案 0 :(得分:0)
将环境变量NSZombieEnabled
设置为YES
,以获取有关过度释放对象的更多有用错误消息。 (通过查看“可执行文件”下的详细信息设置环境变量)
此外,了解您如何定义属性会很有帮助。 (例如data
中SomeViewController
的@property是什么?)
ps - 我知道您没有粘贴实际代码,但data
是NSDictionary
的可怕实例名称。 dict
更好 - 但更具描述性的内容会让您的代码更容易理解。