UIViewController не освобождается при новом управлении памятью ARC - PullRequest
0 голосов
/ 30 июля 2011

Я помещаю свой подкласс UIViewController в стек навигации; тем не менее, поскольку он сохраняется с помощью navigationController, я «освобождаю» свой указатель на него после помещения его в стек, чтобы при его окончательном извлечении viewController был освобожден.

Однако, это не работает, метод dealloc для viewController никогда не вызывается. Код выглядит примерно так:

MyViewController *newViewController =
    [self.storyboard instantiateViewControllerWithIdentifier:@"foo"];

[self.navigationController pushViewController:newViewController animated:YES];

newViewController = nil;

Даже в следующем коде мой newViewController не освобождается:

MyViewController *newViewController =
    [self.storyboard instantiateViewControllerWithIdentifier:@"foo"];
newViewController = nil;

Насколько я понимаю, в новой системе автоматического подсчета ссылок (ARC) объекты освобождаются, когда на это ничего не указывает. Я поместил метод NSLog в метод dealloc создаваемого viewController, но он никогда не вызывается.

Что мне здесь не хватает?!

Спасибо за чтение моего первого сообщения о переполнении стека:)

** EDIT: **

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

(2-е редактирование: и теперь его снова перестало работать. Fffffffuuuuuuuuuuuu)

1 Ответ

1 голос
/ 30 июля 2011

В вашем первом примере было бы очень странно, если бы новый контроллер представления был освобожден, так как вы просто поместили его на контроллер навигации, и, таким образом, контроллер навигации имеет сильную ссылку на него.Объект будет освобожден только после исчезновения ВСЕХ сильных ссылок.

Во втором примере возможно, что возвращенный объект все еще имеет ожидающие релизы от вызовов autorelease, которые были выполнены внутри реализации instantiateInitialViewController,Таким образом, до тех пор, пока текущий пул автоматического выпуска не будет слит, вы не увидите его исчезновения.Кроме того, возможно, что класс UIStoryboard кэширует возвращаемый объект как оптимизацию.

Короче говоря, даже с ARC вы все еще не можете предполагать, что объекты, полученные из методов каркаса, будут немедленно освобождены, когда вы закончитес ними, потому что вы не можете гарантировать, что autorelease не был использован в реализации этого метода.

...