Отпустите UIViewController, если доступно - PullRequest
1 голос
/ 27 мая 2011

Эй, я добавляю UIViewcontroller как подпредставление моего текущего представления.С чем-то вроде этого:

[self.view addSubview:viewcontroller.view];

Пользователь может взаимодействовать с этим добавленным viewcontroller, поэтому я не могу просто выпустить его после того, как я добавил его представление в качестве моего подпредставления, верно?

Так что я бы хотелхотел бы выпустить его метод dealloc и установить его равным nil в viewDidUnload, когда мой главный viewcontroller будет выгружен, верно?

Проблема в том, что viewcontoller, который я добавляю как подпредставление, не добавляется каждый раз.Итак, вопрос в том, как я могу проверить, был ли viewcontroller добавлен как подпредставление, и если да, отпустите его.

Огромное спасибо!Себастьян

Ответы [ 5 ]

2 голосов
/ 27 мая 2011

Если вы правильно прочитали свой код:

[self.view addSubview:viewcontroller.view];

это не контроллер, который добавляется как подпредставление, а представление, которым он управляет.

Это важный момент,поскольку это означает, что сам контроллер не сохраняется.То, что сохраняется, это представление.

Так что вы можете просто продолжать выпускать viewController в -dealloc как обычно:

 -(void)dealloc {
     [viewController release]; viewController = nil;
     ...
 }

и в ваших viewController dealloc вам нужно будет освободить управляемое представление, если вы распределили его вручную (или там, где это имеет смысл для вашего контроллера, если необходимо, чтобы освободить его представление).

С другой стороны, всякий раз, когда ваш superviewпосле освобождения, также будет выпущено представление, добавленное вами как подпредставление (согласно спецификации Apple поведения addSubview).Так что здесь не о чем беспокоиться.Просто правильно отпустите viewController (и убедитесь, что контроллер представления правильно управляет своим видом).

Еще одно замечание: вам не следует выпускать контроллер представления в viewDidUnload.

2 голосов
/ 27 мая 2011

Вы можете проверить это так:

if(viewController)     
{
 [viewController release];
 viewController=nil;
}

и да, вам нужно поместить это в ваш метод dealloc.

1 голос
/ 27 мая 2011

В некотором открытом исходном коде, который я использовал для добавления, у нас был макрос под названием RELEASE_TO_NIL, который делал именно это.

#define RELEASE_TO_NIL(obj) if(obj != nil) { [obj release]; obj = nil; }

Вы бы использовали это так:

RELEASE_TO_NIL(viewController);

Просто так.

0 голосов
/ 27 мая 2011

Согласно документации Apple, экземпляр UIViewController должен управлять представлением, которое заполняет весь экран. Если ваше представление не заполняет экран, вы можете либо создать подкласс UIView для обработки делегирования, либо заставить суперпредставление работать как делегат.

Кроме того, подпредставления представления содержатся в экземпляре NSArray, для возврата этого свойства выполните [myView subviews]. Спросите возвращенный массив, содержит ли он рассматриваемое подпредставление, и вы можете освободить его соответствующим образом.

Но, не зная больше, звучит так, будто вам нужно переосмыслить, как вы все это настраиваете.

0 голосов
/ 27 мая 2011

Просто добавьте тег в viewController.view и проверьте, содержит ли этот тег self.view.

UIView *testView = [self.view viewWithTag:yourTag];
if(testView!=nil){
   doStuff;
}
...