У меня есть относительно простая проблема, которая некоторое время уклоняется от решения. У меня есть контроллер представления и связанный с ним XIB. Контроллер вида называется FooterViewController
. Представление FooterViewController
установлено в виде нижнего колонтитула таблицы.Запретить очистку переменных экземпляра в памяти
FooterViewController
В комплект поставки входит ярлык для показа обратной связи с пользователем. Я бы хотел, чтобы этот ярлык сохранялся до тех пор, пока мое значение не изменилось моим приложением. В нормальных условиях это происходит. Тем не менее, я только что начал тестирование с предупреждениями о памяти, и я обнаружил, что после того, как представление выгружено в ответ на предупреждение о памяти, метка очищается.
Вот что я пытался до сих пор, чтобы решить эту проблему: в viewWillUnload
методе FooterViewController
«s, хранить текст лейбла в переменной экземпляра под названием statusString
:
- (void)viewWillUnload
{
statusString = [statusLabel text];
testInt = 5;
NSLog(@"View will unload; status string = %@; testInt = %d",
statusString, testInt);
[super viewWillUnload];
}
Следует отметить, что я также набор другая переменная экземпляра объявлена NSInteger testInt
, до 5.
Тогда, в FooterViewController
«s viewDidLoad
метод, я пытаюсь установить текст лейбла к statusString
:
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"Just before setting label, statusString: %@; testInt: %d",
statusString, testInt);
[statusLabel setText:statusString];
NSLog(@"View did load.");
}
Однако это не работает. Кроме того, в журнале после моделирования предупреждения памяти, я вижу:
View will unload; status string = Invalid IP address Error code: 113; testInt = 5
(Обратите внимание, что «Неверный код IP-адрес ошибки: 113» правильное значение для statusString)
Затем, после навигации по FooterViewController
опять же, я вижу:
Just before setting label, statusString: (null); testInt: 0
Это указывает мне, что по какой-то причине, переменные экземпляра FooterViewController
являются переинициализации, когда вид нагрузки снова. Последнее замечание: метод initWithNibName:bundle:
вызывается каждый раз, когда представление должно перезагружаться, хотя я ожидаю этого; в конце концов, представление должно быть перезагружено из NIB.
Итак, мои вопросы таковы:
- Почему эти переменные экземпляра, по всей видимости аннулируются или обнуляется в процессе выгрузки и перегрузки вид?
- Если я делаю что-то неправильно, это вызывает эту аннулирование, что это такое?
- Если я не делаю что-либо неправильно, и это нормальное поведение, как я должен обрабатывать состояние состояния между загрузками представления?
Спасибо, Райли
Я объявил statusString как сильное свойство: '@property (неатомический, сильный) NSString * statusString;' и синтезировал его. Тем не менее, я все еще вижу ту же проблему. Я не уверен, что это именно то, что происходит. – ravron
Теперь это странно. Я бы использовал явный setter self.statusString = statusLabel.text вместо прямого ivar-аффектации, просто чтобы увидеть, но я признаю, что сейчас озадачен. Если сеттер ничего не изменит, мы оба должны перечитать документацию ARC :-) –
Согласовано. Я заключил в явный setter: 'self.statusString = [statusLabel text]' и все еще вижу одинаковые результаты. У меня создается впечатление, что предупреждения о памяти обычно освобождают вид VC, но не сам VC. Я обманул? – ravron