Использование инструментов для улучшения управления памятью с контроллерами модального представления - PullRequest
0 голосов
/ 28 сентября 2010

Я чувствую, что не понимаю здесь чего-то фундаментального. Я работал над управлением памятью в своем приложении, используя инструменты для проверки распределения в реальном времени. У меня есть модальный контроллер вида ( settingsViewController ), который имеет изображение для фона. Одна вещь, которую я заметил, заключалась в том, что даже после settingsViewController dealloc все еще существует живой Malloc 520 КБ, 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, верно? Вот как я показываю testViewController в rootViewController .

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

Я хотел бы убедиться, что я понимаю, что происходит, прежде чем двигаться вперед. У меня есть несколько различных модальных контроллеров представления, каждый с различным изображением в качестве фона. Поскольку каждый из них создает Malloc 520 КБ, я в конечном итоге использую 2-3 МБ драгоценной памяти без веской причины. Что держит за эти 520 КБ?

1 Ответ

2 голосов
/ 28 сентября 2010

Когда вы используете метод +[UIImage imageNamed:], платформа кэширует данные изображения для вас. Вот почему вы видите, что это удерживает некоторую память даже после того, как ваше представление выпущено. Если вы работаете в симуляторе и хотите, чтобы он освободил эту память, отправьте симулятору предупреждение памяти после того, как вы отклонили свой вид. Каркас изображения должен затем освободить кэшированные данные изображения.

...