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

使用ARCfunction

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

使用上面的代码页面导航到view2页面,但在那里我无法访问任何button..在view2我按了一个button,我得到错误

Exe_Bad_Access (code = 1 address = 012902)

如何正确释放内存?

但使用

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

这popviewController和pushViewController不工作..(不能导航VIEW2页)

谁知道原因?

问题是你正在创build视图控制器,但你没有使用它,而只是使用它的视图(但让ARC释放视图控制器本身,当它超出范围)。 当在视图控制器之间转换时,应该使用pushViewController(如果您使用的是导航控制器)或presentModalViewController(如果您想以模态方式呈现下一个视图;在iOS 5中使用presentViewController)。 万一你正在使用容器视图控制器,你甚至可以使用transitionFromViewController在子视图控制器之间转换。 有关如何在视图控制器之间转换的指导,请参阅“ 视图控制器编程指南 但在WWDC 2011会议102中,苹果清楚地build议您要确保您的视图控制器的层次结构正确地结构化(通常是您的视图层次结构的镜像); 您不应该只是添加视图并忽略视图控制器层次结构。

无论如何,视图之间转换的标准技术是使用导航控制器(这是什么给你的标题栏“后退”button…你可以隐藏它,如果你不希望它可见):

 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,而不是当前方法的局部variables。 这解决了ARC的问题,但似乎不是一个好的技术,因为你可能应该在视图控制器之间做适当的转换,但是为了充分披露,我提出了它。

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

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

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