Использование dismissModalViewControllerAnimated не освободит память - PullRequest
8 голосов
/ 04 декабря 2009

У меня очень простой код для отображения модального контроллера (nextController является членом класса):

nextController = [[InstructionsScreen alloc] initWithNibName:@"InstructionsScreen" bundle:nil];
[self presentModalViewController:nextController animated:YES];
[nextController release];

А потом, когда контроллер должен скрыться:

[self dismissModalViewControllerAnimated:YES];
nextController = nil;

Все работает хорошо, как и ожидалось, но когда я запускаю инструмент Object Allocations, он показывает, что после закрытия модального контроллера выделенная память не освобождается. Это становится проблемой, потому что, когда я показываю несколько контроллеров, память заканчивается ...

Кто-нибудь может дать мне несколько подсказок? Clang не видит никаких проблем, поэтому я застреваю при достижении лимита памяти, потому что память уволенных контроллеров не будет освобождена.


РЕДАКТИРОВАТЬ: То, что я обнаружил до сих пор, это то, что это, кажется, утечка где-то в вещи Apple. Способ воспроизведения: XCode -> создать новый проект с шаблоном «Утилиты». Не пишите код самостоятельно. Просто создайте новое служебное приложение и запустите его с «Распределением объектов», выберите «Создано и еще жив». Теперь переверните модальный контроллер несколько раз - вы увидите, что выделенная память только увеличивается и увеличивается каждый раз, когда появляется модальный контроллер и когда он тоже исчезает ...

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

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

Я думаю, стоит запустить Static Analyzer, чтобы проверить, не обнаружена ли утечка.

Интересна утечка в коде шаблона Apple. Это может быть, что есть утечка. Это кажется маловероятным, но, очевидно, это не невозможно. Я бы сказал, что более вероятно, что это ложно-положительный результат в приборах, поэтому я бы предложил использовать статический анализатор.

(Возможно, вы захотите сообщить об ошибке об утечке.)

0 голосов
/ 04 декабря 2009

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

Я думаю, что если вы используете синтез для создания средства доступа для свойства nextController, определенного с помощью retain, то средство доступа сохранит любой объект, назначенный этому свойству. Просто установив значение nil, объект не будет освобожден, если для этого не настроен метод доступа, и я не думаю, что это будут сгенерированные автоматически.

Вам необходимо будет позвонить release перед установкой на ноль.

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

...