Утечка памяти, другие проблемы с несколькими UIViewControllers - PullRequest
1 голос
/ 28 октября 2011

Мы начали с оконного приложения в 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 не будут работать для нас, потому что пользователь должен иметь возможность вернуться в главное меню независимо от того, насколько глубоко он находится в иерархии меню.

1 Ответ

1 голос
/ 28 октября 2011

Это не утечка, если есть ссылка на нее. Попробуйте Heapshot, отличный учебник по адресу: weblog-o-mat от bbum

В:

[self.view.window addSubview:slvc.view];
[self.view removeFromSuperview];

Вы просто используете slvc для создания slvc.view, почему бы просто не создать представление, поскольку ViewController не требуется.

Re: UINavigationViewController не будет работать для нас Вы смотрели на:

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated

и

- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...