如何使用ARC为视图控制器正确释放和保留内存? - iOS

时间:2012-06-04 13:39:41

标签: ios xcode

使用ARC功能

record_audio_testViewController *view2 = [[record_audio_testViewController alloc] initWithNibName:@"record_audio_testViewController" bundle:nil];

    [self.view addSubview:view2.view];

使用上面的代码页面导航到view2页面但是我无法访问任何按钮..在view2中我按了一个按钮我收到了错误

Exe_Bad_Access (代码= 1地址= 012902)

如何正确释放内存????

但使用

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

这个popviewController和pushViewController无法正常工作..(不可能导航VIEW2页面)

任何人都知道原因????

3 个答案:

答案 0 :(得分:2)

问题是你正在创建视图控制器,但是你没有使用它,而只是使用它的视图(但是当它超出范围时让ARC释放视图控制器本身)。在视图控制器之间转换时,您应该使用pushViewController(如果您使用的是导航控制器)或presentModalViewController(如果您想以模态方式呈现下一个视图;在iOS 5中使用presentViewController)。在极少数情况下,您使用容器视图控制器,甚至可以使用transitionFromViewController在子视图控制器之间进行转换。有关如何在视图控制器之间进行切换的指导,请参阅View Controller Programming Guide。但是在WWDC 2011会话102中,Apple明确建议您要确保您的视图控制器层次结构正确构建(通常镜像您的视图层次结构);您不应只是添加视图并忽略视图控制器层次结构。

无论如何,在视图之间转换的标准技术是使用导航控制器(这就是为您提供带有“后退”按钮的标题栏...如果您不希望它可见,您可以隐藏它:)< / p>

record_audio_testViewController *view2 = [[record_audio_testViewController alloc] initWithNibName:@"record_audio_testViewController" bundle:nil];

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

// if non-ARC project, uncomment the following line
// [view2 release];

最后,如果您真的想使用添加新控制器视图的技术作为当前视图控制器视图的子视图(这似乎不是一个好主意),您只需要确保ARC当它超出范围时不会释放它。因此,不要让新视图控制器成为当前视图控制器的ivar,而不是当前方法的局部变量。这解决了ARC的问题,但似乎不是一个好的技术,因为你可能应该在视图控制器之间进行适当的转换,但我提出它是为了充分披露。

答案 1 :(得分:1)

在你的.h中设置属性  record_audio_testViewController * view2 无论强弱。 (可能很强大)

另外,请确保已将文件所有者类设置为xib中的record_audio_testViewController。

答案 2 :(得分:0)

record_audio_testViewController *view2 = [[[record_audio_testViewController alloc] initWithNibName:@"record_audio_testViewController" bundle:nil]autorelease]; 
[self.view addSubview:view2];