Плохая утечка памяти при создании представления - даже если «релиз» присутствует? - PullRequest
0 голосов
/ 13 января 2011

Часть моего кода представляет UITableViewController следующим образом:

FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"Settings" bundle:nil];
flipside = [[UINavigationController alloc] initWithRootViewController:controller];  
controller.delegate = self;
flipside.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:flipside animated:YES];
[flipside release];
[controller release];

Используя инструменты утечки, утечки памяти не обнаруживаются.Однако всякий раз, когда я открываю меню настроек (как показано в приведенном выше коде), все больше памяти выделяется и никогда не освобождается - почти 100 КБ каждый раз.

Странно, включение двух операторов освобождения вконец, кажется, не влияет на распределение памяти ..?Есть ли что-то, что я неправильно понимаю в распределении памяти в target-c, или происходит что-то странное?

Любые идеи очень ценятся - спасибо!

1 Ответ

1 голос
/ 13 января 2011

Если обратное свойство является сохраняемым свойством, значит, навигационный контроллер протекает. проблема в том, что вы обходите метод доступа и отпускаете обратную сторону. Это просто грязный код. Лучший способ сделать это - создать метод доступа для обратной стороны, который будет выделять новый, только если вы его еще не создали. Это называется ленивой загрузкой. Для этого просто оставьте @synthesize для обратной стороны (но вы не должны устанавливать его вне метода доступа), в своем заголовочном файле измените свойство на и добавьте этот метод в реализацию:

- (UINavigationController *)flipside {
    if (flipside != nil) {
        return flipside;
    }
    FlipsideViewController *controller = [[[[FlipsideViewController alloc] initWithNibName:@"Settings" bundle:nil];
    controller.delegate = self;
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
    [controller release];
    navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    // This implies a retain if your flipside property is set to retain
    self.flipside = navController;
    [navController release];
}

убедитесь, что в методе viewDidUnload контроллера представления указан self.flipside = nil, из которого вы включили код (я предполагаю, что это действие presentSettings). как теперь должно выглядеть ваше действие presentSetting:

- (IBAction)presentSettings {
    // make sure you use the accessor self.flipside instead on accessing the variable directly
    [self presentModalViewController:self.flipside animated:YES];
}
...