我的部分代码以下列方式呈现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中的内存分配,或者是一些奇怪的事情?
非常感谢任何想法 - 谢谢!
答案 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];
}