Правильно освободить 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 и иметь сам элемент управления представлением (например, быть его собственным делегатом)

В противном случае вам нужно выбрать наиболее логичного "владельца" этих контроллеров представления (часто это контроллеры представления родительского представления) и сделать их иварами своего владельца.

Другие вопросы по тегам