这是我的代码,我试图从一个视图到另一个视图而没有任何内存泄漏。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
firstviewcontroller *first = [[firstviewcontroller alloc] init];
[window addSubview:first.view];
[self.window makeKeyAndVisible];
return YES;
}
-(IBAction)gotosecondview:(id)sender
{
secondviewcontroller *second = [[secondviewcontroller alloc] init];
[self.view addSubview:second.view];
[second release];
}
-(IBAction)gotofirstview:(id)sender
{
[self.view removeFromSuperview];
}
要使上述代码无崩溃,我只需要删除[second release]
。
如果我删除它我会得到内存错误(构建和分析)。我怎么解决这个问题。而且我不想使用[self.navigationController pushViewController:second animated:YES];
所有我想做的事情,我从一个视图导航到另一个视图,反之亦然,没有使用导航控制器。我的firstviewcontroller和secondviewcontroller属于UIViewController
类型。
提前致谢。
答案 0 :(得分:1)
您需要在显示视图时保持当前视图控制器处于活动状态(因此它可以处理用户输入等)。
在您的代码中,您可以通过多种方式实现这一目标:
firstviewcontroller
和secondviewcontroller
的实例保留为实例变量,并使用dealloc
方法发布它们。UIViewController
保留一个实例变量,并在切换到另一个视图时将其释放。第二个选项的代码如下所示:
@interface
UIViewController *currentViewController;
@end
@implementation
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions {
firstviewcontroller *first = [[[firstviewcontroller alloc] init] autorelease];
[self switchToViewController:first];
[self.window makeKeyAndVisible];
return YES;
}
- (void)switchToViewController:(UIViewController *)aViewController {
[currentViewController.view removeFromSuperview];
[currentViewController release];
currentViewController = [aViewController retain];
[self.window addSubview:currentViewController.view];
}
-(IBAction)gotosecondview:(id)sender {
[self switchToViewController:[[[secondviewcontroller alloc] init] autorelease]];
}
@end
这里,维护单个UIViewController
活动的所有逻辑都在于switchToViewController
方法,该方法还处理从一个视图切换到另一个视图的逻辑。作为额外的奖励,您可以通过在switchToViewController
中添加几行来快速添加对动画的支持。
答案 1 :(得分:0)
您无法在通话中释放视图。 在这种情况下你只能做一件事。使用Autorelease,
答案 2 :(得分:0)
[second release]
导致代码崩溃的原因很可能是因为您正在释放视图控制器,而视图控制器又会释放第二个视图。如果您正在尝试完成这一切,那么iPhone手册上有一些关于切换/交换视图的示例代码。这是链接。希望这有帮助!