导航到iPhone中的另一个视图

时间:2011-01-04 15:43:20

标签: iphone cocoa-touch navigation

这是我的代码,我试图从一个视图到另一个视图而没有任何内存泄漏。

- (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类型。

提前致谢。

3 个答案:

答案 0 :(得分:1)

您需要在显示视图时保持当前视图控制器处于活动状态(因此它可以处理用户输入等)。

在您的代码中,您可以通过多种方式实现这一目标:

  • firstviewcontrollersecondviewcontroller的实例保留为实例变量,并使用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手册上有一些关于切换/交换视图的示例代码。这是链接。希望这有帮助!

link text