使用 Instruments 通过模态视图控制器改进内存管理

Posted

技术标签:

【中文标题】使用 Instruments 通过模态视图控制器改进内存管理【英文标题】:Using Instruments to improve memory-management with modal view controllers 【发布时间】:2010-09-28 03:17:14 【问题描述】:

我觉得我不明白这里的基本内容。在使用 Instruments 检查实时分配时,我一直在我的应用程序中进行内存管理。我有一个模式视图控制器 (settingsViewController),它有一个背景图像。我注意到的一件事是,即使在调用 settingsViewController dealloc 之后,仍然有一个活的 Malloc 520 KB,ImageIO 是负责的库。我希望在关闭 settingsViewController 后实时内存会回落。 UIImageView 是否还在某处徘徊?

这是我在viewDidLoad, 中加载图像以及完成后关闭视图控制器的方式。

- (void)loadView 
    [super loadView];

    ////// background ////////
    UIImageView *background = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"settings_background.png"]];
    [self.view addSubview:background];
    [background release];
    //////////////////////////


- (void)viewDidLoad 
    [super viewDidLoad];

    ///////// done button //////////
    UIBarButtonItem *done = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneButtonPressed)];
    self.navigationItem.leftBarButtonItem = done;
    [done release];
    ////////////////////////////////


- (void) doneButtonPressed 
    [self dismissModalViewControllerAnimated:YES];


- (void)dealloc 
    NSLog(@"settingsViewController dealloc"];
    [super dealloc];

此时,这就是 settingsViewController 中的全部内容,所以不需要在 dealloc 中做任何特别的事情,对吧?这是我在 rootViewController 中显示 testViewController 的方式。

- (void) loadSettingsView 
    SettingsViewController *settingsViewController = [[SettingsViewController alloc] init];
    UINavigationController *settingsNavigationController = [[UINavigationController alloc] initWithRootViewController:settingsViewController];
    [self presentModalViewController:settingsNavigationController animated:YES];
    [settingsViewController release];
    [settingsNavigationController release]; 

在继续之前,我想确保我了解正在发生的事情。我有几个不同的模态视图控制器,每个都有不同的图像作为背景。由于每个人都创建了一个 Malloc 520 KB,我最终无缘无故地使用了 2-3 MB 的宝贵内存。是什么保留了这 520 KB?

【问题讨论】:

【参考方案1】:

当您使用+[UIImage imageNamed:] 方法时,框架会为您缓存图像数据。这就是为什么即使在您的视图被释放后,您仍会看到它保留了一些内存。如果您在模拟器中工作并且希望看到它释放内存,请在关闭视图后向模拟器发送内存警告。然后图像框架应该释放缓存的图像数据。

【讨论】:

以上是关于使用 Instruments 通过模态视图控制器改进内存管理的主要内容,如果未能解决你的问题,请参考以下文章

UIAlertController通过模态视图控制器向上和向下推动

关闭当前的模态视图控制器,然后呈现新的模态视图控制器

模态视图的奇怪位置

通过弹出框 didselcet 关闭模态视图

加载黑色背景的模态视图控制器

为模态视图显示透明背景