为什么释放视图控制器会导致崩溃?

问题描述:

我总是推新视图控制器到堆栈是这样的:为什么释放视图控制器会导致崩溃?

MyViewController *vc = [[MyViewController alloc] init]; 

[self.navigationController pushViewController:vc animated:YES]; 

[vc release]; 

而一切运作良好,当谈到一起弹出它关闭堆栈:

[self.navigationController popViewControllerAnimated:NO]; 

但现在当我求婚vc关闭堆栈我在main.m中发生崩溃,提示线路访问不良:int retVal = UIApplicationMain(argc, argv, nil, nil);

但是现在如果我注释掉[vc release]没有更多的崩溃?

但是为什么肯定会泄漏内存,因为我没有发布我创建的东西?

+0

您是否尝试在调试模式下运行它?找出它崩溃的确切路线。也许这与发布无关,因为您发布的代码似乎是正确的 – Sid 2011-06-03 18:17:07

+0

从控制台发布详细消息,如果您不介意,MyViewController的代码可能会有所帮助。 – Sid 2011-06-03 18:20:24

+3

请发布回溯。事故并不在这条线上;它在汇编器的某一行大约有20个栈帧。你发布的代码很好,所以你在其他地方做了一些错误的事情,这些事情对视图控制器的引用计数或其减量的一个对象做了一些不合适的事情,很可能是在'-dealloc'或'-viewDidUnload'期间递减的一个对象。回溯应该告诉你究竟是什么样的对象,你做错了什么。 – 2011-06-03 18:24:25

你的内存管理看起来很好。也许你是在管理你的虚拟内存管理不善。 MyViewController的dealloc方法是什么样的?

我的猜测是你使用的是不正确的init方法(也许是initWithNibName:bundle :),你正在释放从未正确初始化的dealloc中的ivars。

+0

所以我使用initWithNibName并没有更多的崩溃!这对我来说是新的,因为我始终使用init,而不管IB或手动创建。这仍然让我有点在黑暗中......我标记了这篇文章,作为答案,尽管其他人也这样说,我不认为我被允许标记多个帖子作为答案?感谢大家的意见,并指出我的缺点! ;-) – user7865437 2011-06-03 19:47:38

你有没有尝试使用它作为一个

@property 
+0

不,因为我从来没有这样做过呢?我会给它一个去,但很困惑... – user7865437 2011-06-03 18:14:12

+0

使用@property(nonatomic,保留) – Legolas 2011-06-03 18:15:04

+3

不,我不认为使这个视图控制器属性会帮助。我有一种感觉,这次崩溃与他没有发布的代码有关...... – Sid 2011-06-03 18:19:49

导航控制器将保留vc然后,当vc被弹出,navigationController释放它和vc deallocs。

因此,您必须保留发布代码,这是正确的。

我认为你必须使用一个initWithNibName:bundle: insted的init

+0

不,我认为他在推送VC之后调用版本是正确的。如果你使用IB构建VC,你应该使用initWithNibName,否则init很好。 – Sid 2011-06-03 18:16:03

+0

我刚才说他必须在推VC后调用release :) 对于initWithNibName,这可能是我的错。 – DreamOfMirrors 2011-06-03 18:20:24

+0

哦,哈哈抱歉,我的坏,我以为你是告诉他不要释放它.....这就是缺乏咖啡对我来说! – Sid 2011-06-03 18:21:25

他们不同的原因是你没有分配文本对象,因此你不是所有者。国际局的工作是分配和调整它们,这是它的作用。

所以,如果你也尝试释放它,它会导致问题。

也许你错误地管理你的vc内的东西的内存。

@brandontreb这句话真的帮了我很大忙!我挣扎了整整一天了“模拟收到内存警告”后修正崩溃,整整descripted像:
Preventing bad access crash for popViewControllerAnimated in uinavigationcontroller setup

在我推视图控制器的loadView :,通过视图控制器自我其DataSource的init :.

LayoutPickerDataSource *pickerDataSource = [[LayoutPickerDataSource alloc] initWithController:self]; 

而DataSource类保留它喜欢:

@property (nonatomic, retain) LayoutViewController *viewController; 

修复崩溃只是更改为:

@property (nonatomic, assign) LayoutViewController *viewController; 

,并删除:

[viewController release]; 

宾果!我仍然不知道为什么!作为viewController在dealloc:dataSource中发布。