使用UINavigationController时释放对象

时间:2008-12-30 20:22:52

标签: cocoa-touch

我正在使用UINavigationController,当我推送新视图时,我无法释放对象。我想在推送它之前在新控制器上设置一个对象。我目前正在这样做的方式是:

OpenPageViewController *varOpenPageController = [[OpenPageViewController alloc] initWithNibName:@"OpenPageViewController" bundle:nil];
varOpenPageController.bookObj = bookObj;
[[self navigationController] pushViewController:varOpenPageController animated:YES];
//[varOpenPageController release];

如果我取消注释最后一行,那么当我在整个控制器中导航时,程序会崩溃。关于何时/如何释放对象,我还有另一个问题。在bookObj中我有一个可变的Page对象数组,我想更改当前页面对象的文本。我是这样做的:

Page *pageObj = [[bookObj pagesArray] objectAtIndex:currentPage];
pageObj.page_Text = textView.text;
[[bookObj pagesArray] replaceObjectAtIndex:currentPage withObject:pageObj];
//[pageObj release];

如果我取消注释最后一行,程序也会崩溃。它会让我向前导航,但是当我向后导航并尝试再向前行驶时它会崩溃。

自动释放对象会带来类似的结果。如果可以,请告知。感谢。

编辑:当我发布第一个示例varOpenPageController并使用Leaks运行模拟器时,程序似乎正常运行。但是,如果我没有运行Leaks,那么它会崩溃。有没有人有任何想法为什么会这样?感谢。

2 个答案:

答案 0 :(得分:2)

阅读Apple Memory Management Document可能需要付费。第二项不需要释放pageObj,因为它只包含对bookObj数组中实际项的引用。如果有意义的话,这不是实际的项目。所以你实际上正在做的是从数组中释放实际的项目,所以当你回去尝试访问它时,它就不存在了。

经验法则是:只释放您创建的内容。

答案 1 :(得分:2)

将视图控制器推送到导航控制器的第一个示例在发布时是正确的。如果你回来时崩溃了,这可能意味着你在OpenPageViewController dealloc方法中出了问题,但是某些地方出了问题,因为导航控制器会保留你的视图控制器,你应该确保在推送后释放它(如果你有的话)像在代码中一样分配视图控制器实例。)