0

Привет У меня есть очень простая проблема управления памятью с помощью моего UIViewController (или любого другого объекта, который я создаю); Проблема заключается в том, что в Инструменты График распределения объектов всегда растет, хотя я вызываю выпуск, а затем назначаю их nil.Управление памятью UIViewController

У меня есть 2 подкласса UIViewController, каждый из которых инициализируется с помощью NIB; добавить первый ViewController к главному окну, как [window addSubView:first.view]; Тогда в моем первом файл ViewController бобов У меня есть кнопка, которая загружает второй ViewController как:

-(IBAction)loadSecondView{ 
    if(second!=nil){ //second is set as an iVar and @property (nonatomic, retain)ViewController2* second; 
     [second release]; 
     second=nil; 
    } 
    second=[[ViewController2 alloc]initWithNibName:@"ViewController2" bundle:nil]; 
    [self.view addSubView:second.view]; 

} 

В моем (втором) ViewController2 у меня есть кнопка с метод действия

-(IBAction) removeSecond{ 

    [self.view removeFromSuperView]; 
} 

Пожалуйста, дайте мне знать, работает ли приведенная выше схема в управляемом режиме для памяти ...? В приборах Он не показывает выпуск любого распределения и сохраняет график состояния бара, который продолжает расти.

ответ

1

Прежде всего, зачем использовать эту схему, когда второй является свойством:

if(second!=nil){ 
    [second release]; 
    second=nil; 
} 
second=[[ViewController2* second]initWithNibName:@"ViewController2" bundle:nil]; 

Собственость автоматически освобождает его старое значение, когда используется сеттер. Так что это может быть переписано как:

if(self.second == nil) { //Prevents creating a new controller if there already is one. 
    self.second = [[[ViewController2 alloc] initWithNibName:@"ViewController2" bundle:nil] autorelease]; 
} 

Кроме того, что с [ViewController2* second]? Почему эта звездочка есть и что делает метод класса second?

+0

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

+0

Да, свойство всегда будет (афайк) выпустить его предыдущее значение при вызове сеттера. Когда вы определяете свойство как '(сохранение)', он освобождает старый объект и сохраняет новый объект. Остерегайтесь: при выполнении этого: 'self.someStringProperty = [[NSString alloc] init]', свойство сохранит новое значение, так что у вас будет счетчик из двух. 'self.someStringProperty = [[[[NSString alloc] init] autorelease]' предотвратит это. – Rengers

+0

ok Я попробовал ваше предложение, но if (self.second! = Nil) {// Предотвращает создание нового контроллера, если он уже есть. self.second = [[[ViewController2 alloc] initWithNibName: @ "ViewController2" bundle: nil] autorelease]; } никогда не вызывается, поэтому я изменил условие if на if (self.second == nil) , который работает, но затем мой график в Object Allocations все еще растет. – jAmi

Смежные вопросы