4

У меня есть приложение iOS, в котором используется ARC. Я не использую InterfaceBuilder, весь пользовательский интерфейс создается вручную. В этом приложении у меня есть несколько UIViewControllers с SubViewControllers. Эти ViewControllers связаны друг с другом из меню (-ViewController), который толкает их в стек.Память не выпущена в иерархии представления ios

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

Неправильно ли ссылаться на SubViewControllers, как это?

@property (nonatomic, strong) UIViewController subViewController1; 
@property (nonatomic, strong) UIViewController subViewController2; 

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

+0

viewDidUnload только вызывается в условиях низкой памяти – 0x8badf00d

ответ

0

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

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

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

Если вы хотите, чтобы ваши мнения были выпущены, когда они не были на экране, либо установите для свойства представления контроллера значение nil в методе viewDidDisappear: или остановите сохранение контроллеров представления, когда их представления не отображаются на экране и просто создают свежие каждый раз, когда вам нужно их отображать (таким образом, как контроллер, так и представление будут выпущены, когда они не используются).

5

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

Обычно я делаю что-то вроде следующего при нажатии на контроллер представления следующего уровня вниз на навигационной стеком:

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 не является чем-то, что я бы рекомендовал в этом случае из-за опасности указателя на освобожденную память.

+0

Большое спасибо за это, выяснили мои подозрения, как я должен создавать контроллеры представлений, чтобы они были выпущены как можно скорее! – spamoom