2010-01-16 3 views
0

В моем приложении AppDelegate я запускаю контроллер tabBar, к которому добавлена ​​группа navigationController в качестве вкладок. Я использую следующий код:tabBarController memory leak

// 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 являются контроллеры навигации, которые будут добавлены, которые должным образом выпущенные ALLtogether несколько строк позже (они создаются с помощью Alloc). tabBarController - это переменная класса, которая была создана с использованием @property (неатомных, сохраняемых) и @synthesize tabBarController. Он получает команду release в методе dealloc. Теперь инструменты говорят мне, что у меня есть две утечки памяти на линии с помощью «tabBarController.viewControllers = navigatioControllers». Я пытал голову, но я не понимаю, почему: По моему мнению, navigationControllers должны быть выпущены автоматически, и если я отправлю ему команду release несколько строк позже, приложение выйдет из строя, поэтому я думаю, что я прав. Какие-нибудь догадки, что не так?

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

+0

пожалуйста, напишите полный код для выделения/deallocating контроллеров и TabBar, нет ничего, чтобы читать из этого фрагмента. –

+0

Я добавил код, который вы попросили, надеюсь, что он поможет – Robin

ответ

1

Во-первых, переменная класса 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]; } 
+0

Спасибо за ваше решение. Я изменил код так, как вы его предлагали, но я не смог заставить его работать. Я также не совсем понимаю свойство свойства vs. class: Каковы основные отличия? До сих пор я всегда использовал @property и @synthesize для объявления переменных класса. Я использую тот же самый код, который вы предлагали, но я все равно получаю утечку на линии, где добавляются контроллеры Nav/view. Если я попытаюсь выпустить их несколько строк позже, приложение выйдет из строя (что также имеет смысл, поскольку они должны быть доступны впоследствии). Есть идеи по этому поводу? Большое спасибо за помощь! – Robin

+0

Вместо того, чтобы объяснять все это, я предлагаю вам прочитать как можно больше информации о программировании программирования Objective C от Apple http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/ObjC.pdf. Соответствующие разделы для моего ответа - глава «Объявленные свойства» и обсуждение использования «я» при доступе к свойствам в разделе «Обмен сообщениями объектов», – cidered