0

我的应用程序一开始是基于视图的,但后来我不得不更改为基于导航。我这样做的方法是在我的 UINavigationController 中创建一个成员AppDelegate并调用pushViewControllerdidFinishLaunchingWithOptions方法:

@property (nonatomic, retain) IBOutlet UINavigationController *navigator;

// didFinishLaunchingWithOptions implementation
MainController *mainView = [[MainController alloc] initWithNibName:@"MainController" bundle:nil];
navigator = [[UINavigationController alloc]init];
[navigator pushViewController:newSongView animated:YES];
[mainView release];

在我的MainController view我有一个按钮调用此方法并将用户发送到下一个视图:

- (IBAction)newViewLoader:(id)sender {
    SecondViewController *secVC = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    [self.navigationController pushViewController:secVC animated:YES];
}

这工作正常,但按下此按钮的那一刻,模拟器开始使用 5MB 以上的内存。当我按下back导航栏上的按钮而不是按下调用该newViewLoader方法的按钮时,模拟器会多占用 5MB。以此类推,每次加载第二个视图时。所以加载这个视图是相当昂贵的。

按下后退按钮时是否有某种方法可以卸载视图,这样每次打开视图时内存就不会一直增加?这是每次加载视图时发生的屏幕截图。

4

1 回答 1

2

如果您没有使用 ARC,那么您的 IBAction 中至少有一次内存泄漏。它应该是:

- (IBAction)newViewLoader:(id)sender {
    SecondViewController *secVC = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    [self.navigationController pushViewController:secVC animated:YES];
    [secVC release];
}

或者我更喜欢什么:

- (IBAction)newViewLoader:(id)sender {
    SecondViewController *secVC = [[[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil] autorelease];
    [self.navigationController pushViewController:secVC animated:YES];
}

否则你的 secVC 永远不会被释放。您可以尝试添加版本,看看会发生什么。

但是,您确实应该使用 ARC,即自动引用计数。这会为您处理发布。在此处阅读:http: //developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

于 2012-08-31T18:07:54.217 回答