使用 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 通过模态视图控制器改进内存管理的主要内容,如果未能解决你的问题,请参考以下文章