2010-12-31 2 views
1

Каждый раз, когда я поворачиваю страницу в своем приложении, я удаляю и отпускаю предыдущий viewController, но по какой-то причине он все еще находится в памяти. Я знаю это, потому что после использования приложения какое-то время я получаю 47 предупреждений памяти - по одному от каждого контроллера представления - если бы я открыл 47 страниц до появления предупреждения о памяти. Я получаю 60 предупреждений памяти, если я открыл 60 страниц до того, как появилось предупреждение о наличии. И так далее ...ViewController не освобождается

Это код, который работает с одной страницы на другую:

UIViewController *nextController; 
Class nextClass = [pageClasses objectAtIndex:(currentPageIndex - 1)]; 
nextController = [[nextClass alloc] initWithNibName:[pageNibs objectAtIndex:(currentPageIndex - 1)] bundle:nil]; 
[nextController performSelector:@selector(setDelegate:) withObject:self]; 

[currentPageController.view removeFromSuperview]; 
[self.view addSubview:nextController.view]; 

[currentPageController release]; 
currentPageController = nextController; 
[currentPageController retain]; 
[nextController release]; 

Может кто-нибудь точку на любые вопросы, которые они видят?

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

+0

Это не прямой ответ на ваш вопрос, но если я правильно понимаю ваше приложение, вам все равно не нужны все эти новые контроллеры. Если вы просматриваете что-то, и только 2 страницы на самом деле видны сразу (текущая и часть следующего или предыдущего, пока текущий не исчезнет из вида), вы можете просто повторно использовать два контроллера, динамически обновляя содержимое вне экрана один раз перед его появлением. Перерабатывайте те же два снова и снова. Вам даже не нужно путаться, освобождая их до завершения действия или приложения. –

+0

Спасибо, Мэтью. На каждой странице есть кнопка в другом месте, что приведет вас к следующей странице. Было бы сложно разместить более 50 кнопок в Interface Builder и включить или отключить их в зависимости от того, на какой странице был включен пользователь. Полагаю, я мог бы разместить кнопки в IB, записывать x/y и ширину/высоту кнопок, удалять их, а затем программно добавлять и удалять соответствующие кнопки на основе страницы, на которой пользователь включен. Я могу закончить переписывание кода таким образом, если все остальное не получится ... – RanLearns

+0

Если вы можете просто изменить положение (и внешний вид, если необходимо) кнопок, то вы снова сможете устранить создание и отпустить кнопку после кнопки , –

ответ

0

Вы играли с разделами «Поведение и память» на панели «Атрибуты окна» в Инспекторе IB? Здесь вы обычно контролируете использование и освобождение памяти (вне самого кода). Попробуйте изменить значения для рассматриваемого объекта просмотра, а также в окне (или что-то еще для iPhone).

+0

Я не сталкивался с каким-либо упоминанием о том, что Interface Builder связан с памятью до вашего комментария. Если вы можете предоставить какую-либо дополнительную информацию о том, где этот раздел «Поведение и память» находится в IB, я буду изучать его ... но я не уверен, что это относится к разработке iPhone/iPad? – RanLearns

+0

Ссылка на скриншот здесь: http://s3.amazonaws.com/twitpic/photos/full/217343150.png?AWSAccessKeyId=0ZRYP5X5F6FSMBCCSE82&Expires=1293765636&Signature=VS9wBAHy3rDEX1E%2Fjq56bR6we90%3D Я просто создаю Cocoa для X, поэтому он не может применимо к iOS. – Nathan

0

Я считаю, что это потому, что вы звоните retain на currentPageController. Недавно я попросил similar question и получил тонну разъяснений по управлению памятью.

EDIT: Что делать, если вы сделали что-то вроде:

[currentPageController.view removeFromSuperview]; 
[currentPageController release]; 

Class nextClass = [pageClasses objectAtIndex:(currentPageIndex - 1)]; 
currentPageController = [[nextClass alloc] initWithNibName:[pageNibs objectAtIndex:(currentPageIndex - 1)] bundle:nil]; 
[currentPageController performSelector:@selector(setDelegate:) withObject:self]; 

[self.view addSubview:currentPageController.view]; 

Он очищает код немного, и не будет утечка памяти.

+0

Если я прокомментирую сохранение, приложение вылетает с EXC_BAD_ACESS. Мне определенно нужно называть это удержание, так что это не правильное решение для меня.Тем не менее, я прочитаю ответы на ваш подобный вопрос, и я благодарю вас за ответ и попытку помочь! =) – RanLearns

+0

К сожалению, не видел 'release' на' nextController'. Я отредактировал свой ответ, надеюсь, это поможет? :) – donkim

1

Как и в стороне, удостоверьтесь, что у вас также есть nil в любых торговых точках вашего viewController в viewDidUnload и, как правило, делайте обратную ссылку на любой код в viewDidLoad. Я вижу много iOS-кода, который этого не делает, и он останавливает правильную выгрузку контроллеров представлений и связанных с ними представлений.

Смежные вопросы