Рост кучи, когда addSubview и removeFromSuperview - PullRequest
2 голосов
/ 22 февраля 2012

У меня проблема с элементами HEAP GROWTH и PERSISTENT, которые отображаются в разделе «Распределение инструментов», когда я добавляю подпредставление и возвращаюсь к родителю.Подвид представляет собой простой пустой вид с добавленной IB кнопкой «Назад».

В Инструментах я вижу это, когда 6 раз повторяю одно и то же действие, используя «Пометить кучу».Цикл: нажмите на кнопку в родительском, чтобы добавить Subview и вернуться к родительской clickng назад в подпредставлении:

enter image description here

Я думаю, что это будет ноль!Это очень простое действие.

Код, который я использую для загрузки подпредставления в View1Controller.m:

View2Controller *jv;    
jv = [[View2Controller alloc] initWithNibName:nil bundle:nil];
[self.view addSubview:jv.view]; 

А в View2Controller.m я возвращаюсь

-(IBAction) Back {
    [self.view removeFromSuperview];
    self.view = nil;
}

Что я делаю не так?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 22 февраля 2012

Когда вы используете [self.view removeFromSuperview];, self.view отсоединяется от своего суперпредставления, но не освобождается.Таким образом, объем памяти увеличивается.

Чтобы избежать утечек памяти, вы должны освободить память, вызвав метод release для экземпляра View2Controller, созданного в файле View1Controller.m.

Например,Вы можете запомнить ссылку на экземпляр View2Controller, созданный путем установки свойства (в данном примере это свойство jv):

View2Controller *view2controllerInstance = [[View2Controller alloc] initWithNibName:nil bundle:nil]; // create the new instance
self.jv = view2controllerInstance; // memorize the reference
[view2controllerInstance release]; // release the property on view2controller
[self.view addSubview:self.jv.view]; // add the subview

Свойство jv должно быть определено со свойствами объявления следующим образом:

@property (retain, nonatomic) View2Controller *jv;
0 голосов
/ 22 февраля 2012

В вашем втором блоке кода:

-(IBAction) Back {
    [self.view removeFromSuperview];
    self.view = nil;
}

Если это код, который есть в вашем View2Controller, то причина вашей проблемы в том, что вы устанавливаете указатель на представлениеноль до того, как представление может должным образом освободить себя.На своем этапе освобождения он освобождает представление и правильно удаляет элементы Interface Builder.Попробуйте удалить или закомментировать строку self.view = nil;.

...