2009-07-14 2 views
0

У меня есть несколько просмотров в приложении с соответствующими контроллерами. То, что я делаю, выглядит следующим образом.Потребление памяти увеличивается во время работы приложения

Вот нагляднее код:

- (void)applicationDidFinishLaunching:(UIApplication *)application 
{ 
    View1Controller *viewController1 = [[View1Controller alloc] initWithnibName:@"View1"]; 
    View2Controller *viewController2 = [[View2Controller alloc] initWithnibName:@"View2"]; 
    View3Controller *viewController3 = [[View3Controller alloc] initWithnibName:@"View3"]; 

    [window addSubview:viewController1.view]; 
    [window makeKeyAndVisible]; 
} 

В View1Controller файл:

Для некоторых кнопок действий

- (IBAction) goTOView2:(id)sender 
{ 
    iPhoneApplicationAppDelegate *appDelegate = (iPhoneApplicationAppDelegate*) [[UIApplication sharedApplication] delegate]; 
    [appDelegate.window.superView removeFromSuperview]; 
    [appDelgate.window addSubview: appDelgate.viewController2.view]; 
} 

Аналогичны для View3

Я удерживающий все эти три в контроллере приложения. Когда я хочу переключиться на другое представление, у меня есть следующий код.

Не используйте синтаксические ошибки кода.

Этот контроллер трех видов имеет несколько видов с собственным контроллером навигации, который предназначен для нажатия и отображения разных видов.

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

Пожалуйста, помогите и спасибо за это заранее.

+2

Я думаю, что более сложный код будет необходим, чтобы увидеть проблемы; Я думаю, что, возможно, вы немного поспешили обвинять контролеры. –

+0

Согласовано. Также, пожалуйста, переформатируйте свой код, чтобы его было легче читать. – EightyEight

+0

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

ответ

0

Добавление и удаление просмотров из окна вашего приложения не является рекомендуемым способом переключения между контроллерами представлений. Вы должны использовать UITabBar и позволить UITabBarController обрабатывать ваши контроллеры представлений.

Тот факт, что потребление памяти увеличивается, означает, что вы выделяете больше объектов по мере запуска вашего приложения. Вероятно, это не имеет никакого отношения к тому, как вы переключаете представления. Скорее всего, вы выделяете объекты и забываете их освобождать, вызывая утечку памяти. Попробуйте использовать инструмент «Утечки» в «Инструменты», чтобы определить, какие строки кода вызывают проблемы. (Или напишите больше здесь!)

+0

Я использую инструмент утечки памяти и не имею никаких утечек. Плюс, когда я переключаюсь на представление и возвращаюсь к предыдущему виду, он должен показывать ту же память, что и раньше, что не так, инфантная память снова увеличивается. Утечки памяти отмечены красными пирамидами, которые я проверил для всего приложения и не имел утечек в нем. – 2009-07-14 17:34:34

+0

В вашем примере кода показаны три контроллера вида, которые создаются как переменные _local_ в функции applicationDidFinishLaunching :. Вы назначаете новый экземпляр контроллера представления каждый раз, когда вы переключаете представления? В какой-то момент кажется, что вы выделяете новую копию представления, когда думаете, что используете повторно старый. –

+0

Нет Я устанавливаю как @property (неатомный, сохраняю) для всех переменных viewController. Поэтому я просто создаю их один раз при вызове объекта, а затем просто использую свойство view для добавления соответствующих представлений в виде subview. Создает ли она новую копию, когда мы добавляем ее с помощью метода addSubview. Кроме того, если я что-то выделял и не отпускал их, не думайте, что это дало бы мне утечки в инструменте инструмента. – 2009-07-14 20:10:09

0

Инструмент «утечки» обычно не помогает в случаях, когда память медленно растет, они часто не являются утечками, а объекты сохраняются неожиданно.

В инструменте «Распределение объектов» выберите «Созданный и все еще живой» вариант.

Затем выберите регион на графике, где вы увидите больше используемой памяти, когда вы не ожидаете создания новой памяти. Следуйте этой информации, чтобы увидеть, что именно создает объекты, которых вы не ожидаете.

Кроме того, вы говорите, что вы устанавливаете эти контроллеры представлений как свойства. Таким образом, это означает, что вы устанавливаете их точно так же в applicationDidFinishLaunching:

self.viewController1 = viewController1; 

0?

+0

Да, я делаю то, что вы сказали, но я также выпускаю viewController1. означает View1Controller * aViewController = [[View1Controller alloc] initwithNib: @ "View1"]; self.viewController1 = aViewController; [выпуск aViewController]; Я сделал еще несколько исследований и выяснил, что утечки из стороны кварцера, как я показал их на картинке следующего вопроса. http://stackoverflow.com/questions/1127792/where-is-my-memory-getting-consumed – 2009-07-14 20:43:01

+0

Вы действительно должны добавить этот рисунок к этому вопросу, вы можете вернуться и редактировать исходный вопрос здесь ... также вывод для графика никому не нужен, поскольку вы не отметили «созданные и все еще живые», невозможно сказать, какое использование памяти в этом списке из элементов, которые были правильно освобождены. Релиз, который вы делаете на контроллере, в порядке. –

0

Эта линия выглядит неправильно:

[appDelegate.window.superView removeFromSuperview]; 

То, что вы хотите что-то вроде:

[viewController1.view removeFromSuperview]; 

в зависимости от того, какой вид вы отходя от.

+0

хорошо, что я сделал в начале, но позже, подумал я, я мог бы удалить вид, который уже удален. Поэтому я использовал эту часть. Мой предыдущий код был как [appDelegate.viewControoler1.view removeFromSuperview]; Но все же это не влияет на часть потребления памяти. Я хотел спросить, поп и толчок навигационного контроллера влияет на память в стеке. Я думаю, что моя проблема, стек представлений не пуст, вместо этого представления добавляются друг к другу и не удаляются из стека. Becoz потребляемая память показана кварцевой частью ядра. – 2009-07-14 21:04:41

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