Правильно освободить ViewController при добавлении подпредставления без navigationController
Я часто сталкиваюсь с тем, что не могу правильно создать и уничтожить ViewController при добавлении ViewController.view в качестве подпредставления, а не на контроллере навигации.
например:
MyViewController *myViewController = [[MyViewController alloc] init];
[currentView addSubView:myViewController.view];
[myViewController release];
Это прекрасно работает, если это представление без контроллера и нет UIControls, с которыми пользователь должен взаимодействовать. Но отправка сообщений в контроллер представления этого представления вызывает EXEC_BAD_ACCESS, потому что они больше не находятся в памяти.
MyViewController *myViewController = [[MyViewController alloc] init];
[currentView addSubView:myViewController.view];
Это работает при отправке сообщений, однако это утечка памяти и обнаруживается статическим анализатором.
Установка его в качестве свойства текущего контроллера просмотра иногда работает. Но если мне нужно создать группу с неизвестным количеством MyViewControllers и добавить их в нечто вроде UIScrollView, это тоже не сработает.
for (int i = 0; i < [myViewControllers count]; i++) {
MyViewController *myTmpViewController = [[MyViewController alloc] init];
[myCurrentUIScrollView addSubview:myTmpViewController.view];
[myTmpViewController release];
}
По-прежнему происходит сбой, если myTmpViewController взаимодействует с пользователем или что-то подобное. Как можно добавить это и правильно выпустить?
3 ответа
Вы можете иметь NSMutableArray и добавить туда контроллеры.
for (int i = 0; i < [myViewControllers count]; i++) {
MyViewController *myTmpViewController = [[MyViewController alloc] init];
[myCurrentUIScrollView addSubview:myTmpViewController.view];
[myControllers addObject:myTmpViewController];
[myTmpViewController release];
}
// ..
- (void) dealloc {
[super dealloc];
[myControllers release];
}
Вы можете сохранить указатель на контроллер представления в ivar, а затем выпустить его в своем dealloc
метод.
Если такое подпредставление имеет ограниченные "потребности управления", то вы можете рассмотреть возможность создания подкласса из UIView и иметь сам элемент управления представлением (например, быть его собственным делегатом)
В противном случае вам нужно выбрать наиболее логичного "владельца" этих контроллеров представления (часто это контроллеры представления родительского представления) и сделать их иварами своего владельца.