2

В настоящее время у меня есть приложение на основе навигации, и, очевидно, RootViewController - это UITableView. Однако я счел необходимым создать UIToolbar, который плавает над UITableView. В настоящее время я делаю это вот так.UIToolbar Memory Leak

Однако, после того, как с помощью инструмента Утечки инструмента, я был в состоянии определить, что это было причиной несколько утечек памяти, только маленьких, но утечка памяти, тем не менее. Затем я развернулся еще дальше и смог точно указать точные линии, которые вызывают утечку памяти. Они следующие.

UIBarButtonItem *infoButton = [[UIBarButtonItem alloc] initWithTitle:@"Settings" style:UIBarButtonItemStyleBordered target:self action:@selector(account_details)]; 

[toolbar setItems:[NSArray arrayWithObjects:infoButton,nil]]; 

[self.navigationController.view addSubview:toolbar]; 

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

ответ

3

Новая панель инструментов создается каждый раз, когда открывается представление, добавляется в представление и никогда не выпускается. Это означает, что и эта панель инструментов, и элемент кнопки панели будут длиться вечно. Вы можете исправить это, просто отпустив панель инструментов после добавления ее в представление или отправив ей сообщение об автоопределении при его создании. Таким образом, достойный способ сделать это было бы заменить:

toolbar = [[UIToolbar alloc] init]; 

с:

toolbar = [[[UIToolbar alloc] init] autorelease]; 

Кроме того, как вы делаете это, каждый раз, когда ваш взгляд кажется вы в конечном итоге добавив еще одну панель инструментов на вид контроллера. Таким образом, у вас почти наверняка есть несколько таких объектов, сидящих друг над другом (так что вы все равно увидите утечки до тех пор, пока навигация не исчезнет). Что вы можете сделать, так это держать эту панель инструментов в качестве ivar. Когда ваше представление исчезнет, ​​удалите панель инструментов с точки зрения навигационного контроллера. Когда он появится, добавьте его. Создайте панель инструментов в своем методе viewDidLoad и очистите его в viewDidUnload, затем отпустите его в dealloc. Таким образом, ваш новый класс может выглядеть так (предположим, что вы создаете синтезированное свойство с сохраненной в нем панели инструментов):

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    UIToolbar* toolbar = [[[UIToolbar alloc] init] autorelease]; 
    // set up toolbar 
    [self setToolbar:toolbar]; 
    // other load code 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [[[self navigationController] view] addSubview:[self toolbar]]; 
    // other vwa code 
} 

- (void)viewDidDisappear:(BOOL)animated 
{ 
    [super viewDidDisappear:animated]; 
    [[self toolbar] removeFromSuperview]; 
} 

- (void)viewDidUnload 
{ 
    [self setToolbar:nil]; 
    [super viewDidUnload]; 
} 

- (void)dealloc 
{ 
    UIToolbar* toolbar = [self toolbar]; 
    [toolbar removeFromSuperview]; // shouldn't ever need this, but be safe 
    [toolbar release]; 
    // other dealloc 
    [super dealloc]; 
}