2011-02-06 20 views
2

我有这个代码在我的应用程序,它说在'gvc'的内存泄漏。UIViewController要么泄漏内存或崩溃的应用程序,如果自动释放

GameViewController* gvc = [[GameViewController alloc] init]; 
[self.navigationController pushViewController:gvc animated:YES]; 

如果我修改这个代码来自动释放视图控制器,它崩溃我的应用程序一段时间给错误后,“未接法”

GameViewController* gvc = [[[GameViewController alloc] init] autorelease]; 
[self.navigationController pushViewController:gvc animated:YES]; 

是不是有什么毛病自动释放?如何解决这个内存泄漏? 在此先感谢。

+0

哪个特定工具告诉你存在内存泄漏? – 2011-02-06 12:41:33

+0

XCode中的构建和分析显示内存泄漏。 – Cool 2011-02-06 12:56:22

回答

1

只要你全部完成,就发布它。如果您始终需要它,请将GameViewController *gvc;放在标题中,并将[gvc release];放在dealloc方法中。

+0

这个gvc在欢迎屏幕中使用,其他屏幕在欢迎屏幕顶部被推送和放置。你认为我应该用你的方法吗?我认为我的欢迎屏幕将保持原样,并且其他屏幕将被分配 - >按下 - >停用 - >重新分配。 – Cool 2011-02-06 12:55:19

1

显而易见的解决方案是,只要将视控制器推到导航控制器上,就可以发布视控制器。

即:

GameViewController* gvc = [[GameViewController alloc] init]; 
[self.navigationController pushViewController:gvc animated:YES]; 
[gvc release]; 

这么说,我会感到惊讶,如果自动释放实际上是造成内存泄漏的。

2

可以安全地做到这一点:

GameViewController* gvc = [[[GameViewController alloc] init] autorelease]; 
[self.navigationController pushViewController:gvc animated:YES]; 

或本:

GameViewController* gvc = [[GameViewController alloc] init]; 
[self.navigationController pushViewController:gvc animated:YES]; 
[gvc release]; 

它们在功能上等同,并且不会导致内存泄漏或崩溃。看看你的代码[self.navigationController pushViewController:gvc animated:YES];看看你是否过度释放gvc

0

这可能是一切。我的意思是,你的第一个代码显然是泄漏的,而第二个代码片段乍一看是好的,但我们不知道你在那个类中实现了什么。在GameViewController试想一下,你有一个字符串属性用户名,并在其dealloc的,你这样做:

- (void)dealloc 
{ 
    [userName release]; 
    [userName release]; 
    [super dealloc]; 
} 

然后,当你松开控制器的过程中崩溃。您应该使用gdb backtrace(在崩溃时输入“bt”)以查看它崩溃的位置,或者更好地尝试启用NSZombie并使用工具找出。

顺便说一句,在iPhone/iPad编程(资源稀缺)的时候,尽量避免自动发布。

相关问题