创建视图时内存泄漏错误 - 即使存在'发布'?

时间:2011-01-13 03:15:07

标签: iphone objective-c memory-management memory-leaks uiviewcontroller

我的部分代码以下列方式呈现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 kB。

奇怪的是,最后包含两个release语句似乎对内存分配没有影响..?有没有什么东西我误解了objective-c中的内存分配,或者是一些奇怪的事情?

非常感谢任何想法 - 谢谢!

1 个答案:

答案 0 :(得分:1)

如果flipside是保留属性,则导航控制器正在泄漏。问题是你绕过了访问器方法并直接释放了反面。这只是凌乱的代码。更好的方法是为flipside创建一个accessor方法,如果你还没有创建一个,只会分配一个新方法。它被称为延迟加载。要做到这一点,只需留下@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];
}

确保将self.flipside = nil放在视图控制器的viewDidUnload方法中,包含的代码来自(我假设它是一个presentSettings操作)。 你现在的设置动作应该是什么样的:

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