addSubview UIViewController, представление становится более освобожденным - PullRequest
0 голосов
/ 11 февраля 2011

РЕДАКТИРОВАТЬ: Решил проблему самостоятельно.Оказалось, что это был остаток в методе 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;

Ответы [ 2 ]

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

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

@property (nonatomic, retain) NSViewController* someViewController;

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

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

self.someViewController = nil;

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

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

mapViewDidFinishLoadingMap:(MKMapView*)mapView

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

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

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

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

...