Утечка памяти в tabBarController - PullRequest
       14

Утечка памяти в tabBarController

0 голосов
/ 17 января 2010

В моем AppDelegate я запускаю TabBar Controller, к которому в виде вкладок добавляется группа navigationController. Я использую следующий код:

// Init tabBar Controller
tabBarController = [[[UITabBarController alloc] init] retain];

// Init Root Views of navigation controllers
FirstRootViewController* firstViewController = [[[FirstRootViewController alloc] init] autorelease];
SecondRootViewController* secondViewController = [[[SecondRootViewController alloc] init] autorelease];
ThirdRootViewController* thirdViewController = [[[ThirdRootViewController alloc] init] autorelease];

// Init Navigation controllers of tabs
UINavigationController* firstNavController = [[[UINavigationController alloc] initWithRootViewController:firstViewController] autorelease];
UINavigationController* secondNavController = [[[UINavigationController alloc] initWithRootViewController:secondViewController] autorelease];
UINavigationController* thirdNavController = [[[UINavigationController alloc] initWithRootViewController:thirdViewController] autorelease];

firstNavController.navigationBar.barStyle = UIBarStyleBlack;
secondNavController.navigationBar.barStyle = UIBarStyleBlack;
thirdNavController.navigationBar.barStyle = UIBarStyleBlack;

// Create array for tabBarController and add navigation controllers to tabBarController
NSArray *navigationControllers = [NSArray arrayWithObjects:firstNavController, secondNavController, thirdNavController, nil];
tabBarController.viewControllers = navigationControllers;
[window addSubview:tabBarController.view];

И функция dealloc:

- (void)dealloc {
[window release];
[tabBarController release];
[super dealloc]; }

firstNavController - это навигационные контроллеры, которые должны быть добавлены и выпущены должным образом несколькими строками позже (они создаются с помощью alloc).

TabBarController - это переменная класса, созданная с помощью @property (nonatomic, retain) и @synthesize tabBarController. Он получает команду освобождения в методе dealloc.

Теперь инструменты сообщают мне, что у меня две утечки памяти в строке с "tabBarController.viewControllers = navigationController".

Я пытал свою голову, но я не понимаю, почему: насколько я понимаю, навигационные контроллеры должны выпускаться автоматически, и если я отправляю команду на освобождение несколькими строками позже, приложение вылетает, поэтому я думаю, что я прав.

Есть предположения, что не так?

Большое спасибо!

1 Ответ

1 голос
/ 18 января 2010

Во-первых, ваша переменная класса tabBarController имеет счетчик ссылок, увеличенный вдвое. Один раз из alloc и один раз из retain в первой строке вашего кода, но только один раз из dealloc Это, вероятно, откуда происходит утечка памяти.

Во-вторых, хотя вы объявили соответствующий @property(nonatomic, retain) tabBarController (и реализован через @sysnthesize), вы на самом деле не используете средства доступа к свойству (и соответствующее поведение сохранения и освобождения во время присваивания). Для этого вам нужно использовать self.tabBarController вместо tabBarController, который будет ссылаться на переменную класса, а не на свойство.

Попробуйте изменить код следующим образом, чтобы увидеть, решит ли это вашу проблему

// Init tabBar Controller
UITabBarController* tbc = [[[UITabBarController alloc] init];
self.tabBarController = tbc;
[tbc release];
...

- (void)dealloc {
[window release];
self.tabBarController = nil;
[super dealloc]; }
...