Мы начали с оконного приложения в XCode.В AppDelegate мы можем
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
MainMenuViewController *mvc = [[MainMenuViewController alloc] initWithNibName:@"MainMenuViewController" bundle:nil];
self.window.rootViewController = mvc;
[mvc release];
[self.window makeKeyAndVisible];
return YES;
}
MainMenuViewController
создать один из нескольких других классов UIViewController
, которые также позволяют пользователю вернуться в главное меню.В MainMenuViewController
мы имеем следующее:
SecondLevelViewController* slvc = [[SecondLevelViewController alloc]initWithNibName:@"SecondLevelViewController" bundle:nil];
[self.view.window addSubview:slvc.view];
[self.view removeFromSuperview];
SecondLevelViewController
имеет аналогичный код, возвращающийся в главное меню.Это работает, но в конечном итоге создает несколько экземпляров обоих классов после нескольких перемещений назад и вперед, и, очевидно, это нужно сделать другим способом.В то время как Instruments не сообщает о каких-либо утечках памяти, общее использование памяти приложением продолжает расти, и количество живых выделенных экземпляров контроллеров представления также увеличивается.
Мы думали, что вызов removeFromSuperview
освободит предыдущийview controller, но этого не происходит, хотя в документации сказано, что это должно быть.
Мы также заметили, что необходим вызов release
SecondLevelViewController* slvc = [[SecondLevelViewController alloc]initWithNibName:@"SecondLevelViewController" bundle:nil];
[self.view.window addSubview:slvc.view];
[self.view removeFromSuperview];
[slvc release]; // < < < added this line
, но это привело к SIGABRT
и unrecognized selector sent to...
.
A UINavigationViewController
не будут работать для нас, потому что пользователь должен иметь возможность вернуться в главное меню независимо от того, насколько глубоко он находится в иерархии меню.