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

时间:2010-09-28 03:17:15

标签: objective-c memory-management uiimageview instruments

我觉得我不明白这里有什么根本的东西。我一直在使用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 个答案:

答案 0 :(得分:2)

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