如何释放并妥善保留内存使用ARC视图控制器? - iOS设备(How to release

2019-09-17 18:07发布

使用ARC功能

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

    [self.view addSubview:view2.view];

使用上面的代码的页面导航到视图2页但是我不能够访问任何按钮。在视图2我按下按钮,我得到错误

Exe_Bad_Access(代码= 1个地址= 012902)

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

但使用

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

这popviewController和pushViewController不工作。(无法进行导航视图2页)

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

Answer 1:

问题是,你正在创建的视图控制器,但你不使用它,而只是使用它的视图(但让ARC释放视图控制器本身,当它超出范围)。 当视图控制器之间的转换,则应该使用pushViewController(如果您使用的导航控制器)或presentModalViewController(如果你想模态呈现下一个视图;在IOS 5使用presentViewController)。 万一你正在使用的容器视图控制器,你甚至可以使用transitionFromViewController子视图控制器之间的过渡。 见视图控制器编程指南 ,了解如何视图控制器之间过渡的指导。 但在2011年WWDC会议102,苹果明确建议,要确保您的视图控制器的层次结构进行适当的结构(通常镜像视图层次); 你不应该只是添加视图,并忽略视图控制器层次。

总之,对于视图之间转换的标准技术是使用导航控制器(这是给你的“返回”按钮,标题栏...您可以将其隐藏,如果你不希望它不可见):

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不当它超出范围释放。 所以,不要让它走出去的范围通过使新的视图控制器当前视图控制器的伊娃,而不是你当前方法的局部变量。 这解决了ARC的问题,但似乎并不像一个很好的技术,或许你应该做的视图控制器之间的适当过渡,但我目前它在完全公开的利益。



Answer 2:

在您的.h设置record_audio_testViewController *视图2无论是强或弱的财产。 (可能强)

此外,请确保您已设置文件的所有者类record_audio_testViewController在厦门国际银行。



Answer 3:

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


文章来源: How to release and retain memory properly for view controllers using ARC ? - iOS
标签: ios xcode