Правильно освободить ViewController при добавлении подпредставления без navigationController - PullRequest
3 голосов
/ 01 февраля 2011

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

Ответы [ 3 ]

1 голос
/ 01 февраля 2011

Вы можете создать 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];
}

1 голос
/ 01 февраля 2011

Вы можете сохранить указатель на контроллер представления в ivar, а затем освободить его в вашем dealloc методе.

0 голосов
/ 01 февраля 2011

Если такое подпредставление имеет ограниченные «потребности управления», то вы можете рассмотреть возможность создания подкласса из UIView и иметь сам элемент управления представлением (например, быть его собственным делегатом)

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

...