iPhone - Включая подпредставления и возможную утечку памяти? - PullRequest
2 голосов
/ 05 мая 2011

При написании этого общего утверждения:

UIViewController* viewController = [[UIViewController alloc] initWithNibName:@"myXIB" bundle:nil];
/* do some things with the viewController */
[self.view addSubview:viewController.view];

Мне интересно, возможна ли здесь утечка памяти, потому что:

  • viewController не выпускается кодом
  • вызов [viewController release] после вставки его в self.view приводит к сбою приложения
  • viewController не известен self.view, потому что он не вставлен напрямую, поэтому при выпуске self.view не следует выпускать viewController

Итак, я вижу утечку памяти, когда viewController никогда не выпускается.

Не могли бы вы дать мне свой эксперт знания об этом?

Примечание. Прибор не обнаруживает утечки памяти.

Ответы [ 4 ]

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

Да, память будет течь, вы всегда должны освобождать память, выделенную вами. Когда вы добавляете [viewController release], viewController немедленно освобождается, а затем ваше приложение падает, потому что оно пытается получить доступ к освобожденной памяти. Чтобы предотвратить это, вы должны включить ваш viewController в качестве переменной экземпляра вашего класса.

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

Если вы хотите, чтобы представление было вложенным, я думаю, что лучше всего иметь контроллер представления в качестве переменной экземпляра класса и release в dealloc

UPDATE

Взято из предыдущего вопроса SO

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

Инструменты не знают макет или контекст указателя. Если ты был Malloc (1024) и там случилось быть куча указателей в этом [переработанный] кусок памяти, те будет рассчитывать, даже если вы никогда не будете относиться к этим указателям как к реальным снова ссылки.

Итак, нет, утечки никогда не могут быть 100% точный. Кроме того, есть гораздо больше много способов утечки памяти, чем фактическая утечка.

0 голосов
/ 01 мая 2014

Tableview didselrowatindex - это обычное место, где происходят такие утечки памяти.

Один из способов устранить утечки памяти - убедиться, что вы создали только один экземпляр ViewController, а затем повторно его используете.

Кроме того, эта техника применяется не только для создания и отображения контроллеров представления, но и всего остального.Если вы создаете что-либо в коде, например, uilabels и т. Д., Убедитесь, что вы не создаете несколько экземпляров.

/ * code * /

// in the interface create an ivar ... or a property if needed
UIViewController *childViewController;

///, а затем позжекод, табличное представление didSelectRow и т. д.

// don't create multiple instances of the VC, rather, check to see if we can reuse one
if (! childViewController)
{
   childViewController = [[UIViewController alloc] init];
}

// do some things with the viewController 
childViewController.someProperty = someValue;
[self.view addSubview:childViewController.view];
0 голосов
/ 05 мая 2011

Здесь определенно есть утечка, когда вы выделяете новый UIViewController, но никогда не освобождаете его (он не добавляется в пул автоматического выпуска, когда вы делаете выделение).Вы должны сохранить ссылку на этот объект viewController и позднее освободить ее.

Как вы сказали, если вы вызываете сразу после [releaseController release], приложение действительно вылетает, потому что вы только что добавили его внутреннее представление вself.view, но счетчик ссылок контроллера, которому принадлежит это представление (viewController), не был увеличен.

...