问题是您正在创建视图控制器,但您没有使用它,而只是使用它的视图(但当它超出范围时让 ARC 释放视图控制器本身)。在视图控制器之间转换时,您应该使用 pushViewController(如果您使用导航控制器)或 presentModalViewController(如果您想以模态方式呈现下一个视图;在 iOS 5 中使用 presentViewController)。万一您使用的是容器视图控制器,您甚至可以使用 transitionFromViewController 在子视图控制器之间进行转换。请参阅查看控制器编程指南有关如何在视图控制器之间转换的指导。但是在 WWDC 2011 session 102 中,Apple 明确建议您要确保视图控制器的层次结构正确结构化(通常反映您的视图层次结构);您不应该只是添加视图而忽略视图控制器层次结构。
无论如何,在视图之间转换的标准技术是使用导航控制器(这就是为您提供带有“后退”按钮的标题栏......如果您不希望它可见,您可以将其隐藏):
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,而不是当前方法的本地 var。这解决了 ARC 问题,但似乎不是一个好的技术,因为您可能应该在视图控制器之间进行适当的转换,但我提出它是为了充分披露。