我总是把一个新的视图控制器推到堆栈上,如下所示:
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 :(得分: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。