0

Я использую ARC (автоматический подсчет ссылок).Получение предупреждения о памяти и утечке памяти

Это нормально, если я установил IBOutlets на нуль в viewDidDisappear вместо viewDidUnload?

Такие, как эти:

[self setTheImage:nil]; 
[self setBTNplay:nil]; 
[self setBTNstop:nil]; 

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

Еще одна вещь: Если на каждой странице есть аудиоплеер, где я должен установить @property (nonatomic, strong) AVAudioPlayer *audioPlayer; на нуль?

Или как мне установить слабые, а не сильные? Потому что это дает мне «предупреждение», то в этом коде строке:

_audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:poemURL error:nil]; 

он говорит: Назначение удерживаемого объекта слабой переменной

+1

Viewdidunload устарел в iOS6. Это больше не будет вызвано! – Felix

+0

Итак, как объекты получают «nil'ed? где? – Milad

+0

В 'didReceiveMemoryWarning', я полагаю, – Felix

ответ

2

Вам не нужно всухую из этих значений в viewDidUnload. Убедитесь, что вы используете слабые свойства вместо сильных или назначаете для IBOutlet s. Предупреждение о принимаемой памяти не обязательно означает, что вы протекаете. Предупреждение о принятой памяти означает, что ваше приложение потребляет слишком много памяти. Запустите Инструменты и отредактируйте свой вопрос, сколько памяти использует ваше приложение.

Тот факт, что вы используете AVAudioPlayer, заставляет меня думать, что, возможно, вы сбрасываете массивные звуковые файлы в память.

Также, кстати, initWithContentsOfURL:error: получит отказ от магазина приложений, потому что вы блокируете основной поток. Попробуйте протестировать свое приложение на iPhone только с поддержкой сотовой связи и зайдите в часть своего офиса/дома, где есть плохие подключения к Интернету. Также попробуйте, чтобы ваш телефон переключился в режим самолета. Ваше приложение, без сомнения, либо замерзнет в течение длительного времени, пока соединение не сработает, либо просто сработает.

Вместо этого вы должны использовать грандиозную центральную отправку или загрузить ее с помощью методов блока или делегатов NSURLConnection.

+0

о initWithContentsOfURL: файл не загружается. это происходит от местных. Я отключил Wi-Fi на iPod touch, и все получилось просто отлично. без замерзания или такого крушения. ;) – Milad

+0

Ах ладно. Я предполагал иначе, свою ошибку. –

2

Во-первых, не устанавливайте нулевые свойства в viewDidDisappear, потому что ваш вид все еще загружен. Вы должны всегда устанавливать их в viewDidUnload. Он вызывается в ситуациях с низкой памятью, и здесь вы должны очистить все, что разрушает системную память.

компании Apple UIViewController reference для viewDidUnload

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

Во-вторых, посмотрите на этом уроке, где объясняется очень хорошо ARC

0

Вы звоните [[NSNotificationCenter defaultCenter] removeObserver:self]; из одного из ваших представлений контроллеров подклассов? Если это так, это объясняет, почему вы не вызываете viewDidUnload.

Если это проблема, вы должны удалить себя из определенных уведомлений, когда это необходимо, а не обо всех уведомлениях, как указано выше. (Это нормально позвонить removeObserver:self из dealloc, хотя.)

+0

нет, это не проблема. очевидно, как сказал Pheel выше, viewDidUnload только вызывается в определенных ситуациях. – Milad

0

Это нормально, если я поставил IBOutlets к нулю в viewDidDisappear вместо из viewDidUnload?

В этом утверждении много чего не так.

Прежде всего, вы не устанавливаете IBOutlets на нуль в viewDidDisappear. viewDidDisappear вызывается, когда вид «исчезает» (например, когда он находится в контроллере панели вкладок, и вы переключаетесь на другую вкладку или на навигационном контроллере, и вы нажимаете что-то поверх нее); представление может снова появиться снова без повторной загрузки. Если вы установите IBOutlets на ноль, они не будут установлены снова, когда вы появляетесь. (Они устанавливаются только при загрузке представления.)

Во-вторых, если у вас есть утечка и настройка материала на нуль «исправляет это», это означает, что вы не выпускаете переменные экземпляра. Вы всегда должны отпускать сохраненные переменные экземпляра в dealloc.

Я даже поставил код журнала в методе viewDidUnload. Но это не , кажется, получилось вызвано, когда я даже попал в rootViewController!

Да, viewDidUnload вызывается только в ситуациях с низкой памятью. В большинстве случаев он не называется нормально. Если вы зависели от того, что он был вызван, вы использовали неправильный метод.

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