在Objective C中推送和弹出UINavigationController时的内存问题

时间:2012-05-10 04:48:33

标签: iphone objective-c xcode4 uinavigationcontroller

我有两个视图控制器VC1和VC2。我尝试通过创建VC2的对象并按下按钮动作来推送VC2。

VC2 *vcOject = [[VC2 alloc]init];
[self.navigationController pushViewController:vcOject animated:YES];
[vcObject release];
在VC2中的

我在按钮动作中弹出它。

[self.navigationController popViewControllerAnimated:YES];

现在我在VC1并再次推送VC2进行显示。但这次我得到EXC_BAD_ACCESS错误。但当我评论[vcObject发布]。它工作正常。但什么时候能释放记忆。内存在导航控制器中的处理方式。

2 个答案:

答案 0 :(得分:1)

简单回答:您应该使用ARC

如果由于某种原因你不能,你的视图控制器一旦从堆栈中弹出就会被解除分配,你应该在每次想要将它推入堆栈时分配/初始化一个新的视图控制器。或者,如果您不想这样做 - 比如说,如果VC2中的视图非常重 - 请删除[vcObject release]并在VC1中保留对vcObject的引用,并继续推送同一个在堆栈上。但是,请确保不要将这两者混合在一起;如果每次在将对象推入堆栈后必须将其释放,则创建一个新对象,并且如果每次都保持引用同一个VC2,则必须在VC1的dealloc之前释放它。 。请记住,必须在VC1的dealloc方法中释放它,否则内存将被泄露。

但是,真的。 您应该使用ARC。

答案 1 :(得分:1)

如果您不使用[vcObject release]。它会导致内存泄漏到您的应用程序中。

所以,这是使用push / pop viewController处理内存管理的方法,而不使用 ARC

VC2 *vcOject = [[VC2 alloc] init];
[[self.navigationController pushViewController:vcOject animated:YES] autorelease];