У меня проблемы с памятью с моим приложением iOS, и у меня есть несколько вопросов об этом.Вопросы о предупреждениях памяти
Ели из всех, я работаю с iOS 6, и я использую ARC.
Теперь позвольте мне объяснить мою ситуацию:
У меня есть 2 точки зрения. С первого взгляда, если я нажимаю на кнопку, я создаю вторую точку зрения (с помощью alloc
и init
) и отобразить его как модальный используя этот код:
[self presentViewController:secondView animated:YES completion:^{
[secondView prepareToDraw]; // Function I use to start my computations and rendering
}];
В какой-то момент, когда расчеты закончены I хотите закрыть второе представление и вернуться к первому виду. Я использую этот код из моего второй точки зрения:
[self dismissViewControllerAnimated:YES completion:^{
[self finished]; // Function I use to free some malloc
}];
Я бег моего приложения с инструментами распределением и утечками и у меня нет никаких утечек.
Вот код моего didReceiveMemoryWarning
:
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
if ([self isViewLoaded] && ([[self view] window] == nil)) {
self.view = nil;
[self tearDownGL];
if ([EAGLContext currentContext] == self.context) {
[EAGLContext setCurrentContext:nil];
}
self.context = nil;
}
// Dispose of any resources that can be recreated.
NSLog(@"Resources freed");
}
tearDownGL
функция освобождает OpenGLES ресурсы, такие как текстуры, вершинные массивы, ...
Когда я запускаю мое приложение, после нескольких переключений между первым и во втором представлении я получаю предупреждения о памяти, а затем сбой приложения.
Вот мои вопросы:
1- ли приложение автоматически освобождая мою UIImage, UIView, ... из моих контроллеров? Если нет, как я могу освободить их, поскольку я использую ARC? Я также видел функцию viewDidUnload
, но это не рекомендуется, как сказано в документации:
Вызывается, когда вид контроллера освобождается из памяти. (Не Устаревшие в прошивкой 6.0. Представления уже не продувают в условиях низкой памяти и поэтому этот метод никогда не вызывается.)
Но если взгляды не продували больше в условиях низкой памяти, как я могу бесплатно больше памяти, чтобы предотвратить сбой приложения? Что мне делать?
2- Я поставил точку останова на функцию didReceiveMemoryWarning
для моих 2 контроллеров. Когда я запускаю приложение на симуляторе, я имитирую предупреждение о памяти. Я вижу, что didReceiveMemoryWarning
вызывается один раз для моих 2 контроллеров. Но если я переключаюсь несколько раз между моим первым и вторым контроллерами, то didReceiveMemoryWarning
вызывается один раз для моего первого контроллера вида, но вызывается несколько раз для моего второго контроллера представления. Если я переключусь 3 раза, функция будет называться 3 раза. Поэтому, я думаю, когда я «закрываю» свое второе представление, чтобы вернуться к первому представлению, второе представление не освобождается и все еще существует. Зачем ? Как я могу заставить его быть уничтоженным? (поскольку я больше не буду его использовать и создаю новый) Я создаю второй контроллер представления в функции, и я не могу ссылаться на него (он не сохраняется в классе).
Настройка переменных на nil работает для меня. Но это странно, почему не переменная, освобожденная в конце блока напрямую? –
С ARC он освобождается, когда нет сильной ссылки слева. Там могут быть все еще слабые ссылки. Слабые ссылки должны выполняться автоматически, но не полагаться на это. Без ARC память может быть освобождена более или менее к концу блока только в том случае, если она была автореализована (и если на ней нет другого, не сохраняемого автореализацией). –
Спасибо, я понимаю, как это работает сейчас –