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

时间:2011-06-03 18:05:23

标签: iphone uiviewcontroller uinavigationcontroller release exc-bad-access

我总是把一个新的视图控制器推到堆栈上,如下所示:

 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]不再崩溃了吗?

但是为什么这肯定会泄漏记忆,因为我没有发布我创造的东西?

5 个答案:

答案 0 :(得分:3)

您的内存管理看起来很好。也许你错误地管理了你的vc里面的东西。 MyViewController的dealloc方法是什么样的?

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

答案 1 :(得分:0)

您是否尝试将其用作

@property

答案 2 :(得分:0)

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

所以,你必须保留发布代码,这是正确的。

我认为您必须使用initWithNibName:bundle:的{​​{1}}内容。

答案 3 :(得分:0)

它们不同的原因是您没有分配文本对象,因此您不是所有者。 IB的工作就是分配和重新定位它们。

因此,如果您也尝试发布它,则会导致问题。

答案 4 :(得分:0)

  

也许你对vc里面某些东西的记忆管理不善。

来自@brandontreb的这句话真的帮助了我!在“收到模拟记忆警告”之后,我一整天都在努力修复崩溃,完全描述如下:
Preventing bad access crash for popViewControllerAnimated in uinavigationcontroller setup

在我推送的视图控制器的loadView:中,将视图控制器self传递给它的dataSource的init:。

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

虽然dataSource类保留了它,如:

@property (nonatomic, retain) LayoutViewController *viewController;

修复崩溃只是改为:

@property (nonatomic, assign) LayoutViewController *viewController;

并删除:

[viewController release];

宾果!我还是不知道为什么!正如viewController在dealloc中发布的:of dataSource。