addSubview из UIViewController, представление освобождается

РЕДАКТИРОВАТЬ: Решил проблему сам. Оказалось, что это был остаток в методе Dealloc, который вызывал двойное освобождение UIButton...

Я пытаюсь отобразить UIViewController поверх другого UIViewController, как всплывающее окно. Проблема в том, что представление, похоже, перегружено. С NSZombieEnabled я получаю следующую ошибку:

[Выпуск CALayer]: сообщение отправлено освобожденному экземпляру 0x784bf40

Я использую этот код для добавления представления:

//self.someViewController is declared as (nonatomic, retain)
self.someViewController = [[[SomeViewController alloc] initWithDelegate:self] autorelease];
[self.view addSubview:self.someViewController.view];

Затем позже я удаляю представление следующим образом:

[self.someViewController.view removeFromSuperview];
self.someViewController = nil;

person Rengers    schedule 11.02.2011    source источник
comment
Что такое декларация someViewController?   -  person jv42    schedule 11.02.2011
comment
re: robin => Он присваивает собственность. Если собственность сохранена (или скопирована), он должен автоматически освобождаться.   -  person jv42    schedule 11.02.2011
comment
[self.view addSubview:someViewController.view]; дать вот так вместо [self.view addSubview:self.someViewController.view];   -  person kanmani    schedule 11.02.2011
comment
а также дать вот так: [someViewController.view removeFromSuperview]; Я надеюсь, что это полезно для вас.   -  person kanmani    schedule 11.02.2011


Ответы (2)


Если предыдущие комментарии не решат эту проблему, возможно, это может помочь. Я предполагаю, что вы создали свое свойство someViewController, подобное этому

@property (nonatomic, retain) NSViewController* someViewController;

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

т.е. когда ты звонишь

self.someViewController = nil;

это должно немедленно освобождать память (при условии, что кадр прошел там, где существует VC, поэтому количество автоосвобождений уже уменьшилось). Поэтому, если у вас есть ДРУГОЙ объект, используемый в этом VC someViewController, который все еще существует и имеет делегат, установленный для вашего объекта someViewController, и выполняет фоновую задачу, это вызовет сбой, когда он попытается вернуться к вашему теперь освобожденному объекту. (Если вы не освободите свой VC, вы не увидите этого сбоя)

Например, если у вас есть MKMapKit, отображаемый в someViewController, а для делегата установлено значение someViewController... если вы реализовали метод в someViewController

mapViewDidFinishLoadingMap:(MKMapView*)mapView

MKMapKit все еще может вызывать это из другого потока, если вы не уничтожили объект MKMapView перед своим.

Я бы всегда устанавливал другие делегаты объекта, указывающие на ваш VC (например, MKMapView), на ноль, прежде чем уничтожать указанный VC, который он использует, чтобы избежать этого риска. Для рендеринга PDF (CALayer?) вы можете обнаружить, что вам также нужно явно освободить объект, учитывая, что это использует другую парадигму распределения/освобождения памяти.

person sradforth    schedule 11.02.2011
comment
Я уже проверил someViewController и убедился, что все остальные делегаты объектов установлены в nil в dealloc. - person Rengers; 11.02.2011

Сам решил проблему. Оказалось, что это был остаток в методе Dealloc, из-за которого UIButton был выпущен дважды...

person Rengers    schedule 11.02.2011