Назначив контроллеры представлений, которые попадают в стек, к сильной переменной/свойству экземпляра, они не будут освобождены при удалении из стека. Сильные свойства держатся за толкаемые контроллеры представлений даже после того, как они выскользнули из стека, поэтому они никогда не доходят до состояния, в котором они могут быть освобождены.
Обычно я делаю что-то вроде следующего при нажатии на контроллер представления следующего уровня вниз на навигационной стеком:
SLSMoleculeSearchViewController *searchViewController = [[SLSMoleculeSearchViewController alloc] initWithStyle:UITableViewStylePlain];
[self.navigationController pushViewController:searchViewController animated:YES];
Под ARC, будет выделен новый контроллер представления и будут сохранены при создании. При нажатии на навигационный стек он будет удерживаться один раз навигационным контроллером. Поскольку этот новый контроллер представления не упоминается после нажатия и не привязан к сильной переменной свойства или экземпляра, ARC освободит его после второй строки.
Помните, что он по-прежнему сохраняется навигационным контроллером, поэтому он по-прежнему остается в памяти. Однако, как только контроллер навигации выталкивает его из стека, этот контроллер будет освобожден. Поскольку в этот момент ничего не держится, он будет освобожден, как ожидалось.
Если по какой-то причине вам необходимо поддерживать ссылку на этот контроллер подвид в вашем контроллере верхнего уровня, вы можете использовать свойство weak
или переменную экземпляра __weak
. Это не будет удерживаться контроллером представления и будет выключено, когда контроллер будет освобожден.
weak
ссылки поддерживаются только для приложений, ориентированных на iOS 5.0, поэтому вы не сможете сделать это для чего-то, что необходимо для запуска на iOS 4.0. Свойство 4.0-compatible unsafe_unretained
не является чем-то, что я бы рекомендовал в этом случае из-за опасности указателя на освобожденную память.
viewDidUnload только вызывается в условиях низкой памяти – 0x8badf00d