как освободить объект класса, который сохраняется вручную - PullRequest
2 голосов
/ 22 ноября 2011

Я работаю над приложением на панели вкладок У меня есть класс A с .xib и класс B с .xib

В классе A я загружаю несколько экземпляров класса B.

Т.е. в классе А я занимаюсь.

в .m файле

   -(void)renderData:(NSArray *)Data
    {
         for(int i=0;i<[Data count];i++)
            {
               B *grid=[[B alloc]initWithNibName:@"Beta" bundle:[NSBundle mainBundle]];
               .
               .
               . //do something with the grid object i.e assign new image etc..)
               [self.myGrid addObject:grid]; //i have a NSMutableArray myGrid declared in .h
               [grid release];  
            }
    }

Теперь в массиве myGrid у меня сохранены все объекты сетки.

Теперь я добавляю их в представление класса Aplha.

    for(int i=0;i<[myGrid count];i++)
      {
        B *grid1=[[myGrid objectAtIndex:i]retain]; //i have done this retain because when i try to come back to this tab or try to call the same function it crashes by saying message send to deallocated instance.
        [self.view addSubview:grid1.view];
       }

Теперь моя проблема в том, как освободить сохраненный мной объект grid1.

Ответы [ 2 ]

6 голосов
/ 22 ноября 2011

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

Если ваши grid1 объекты хранятся в self.myGrid, то они сохраняются в этом массиве.Вы выпускаете myGrid где-нибудь?Пока это сохраняется, ваши grid1 объекты должны быть.

Кроме того, здесь есть некоторые концептуальные проблемы.Загрузка контроллера представления из пера и добавление его вида как подвид представления другого контроллера представления обычно некорректны.Трудно рекомендовать правильный подход, не зная точно, чего вы пытаетесь достичь.

Вам не нужно передавать [NSBundle mainBundle] в initWithNibName:bundle: - вы можете просто передать nil, поскольку поведение по умолчаниюиспользовать основной пакет.

Ваш комментарий говорит о том, что вы "присвоили" NSMutableArray в заголовке.Вы ничего не назначаете в своем заголовке, вы просто объявляете вещи.Вы действительно инициализировали NSMutableArray где-то в своей реализации?

2 голосов
/ 22 ноября 2011
  • Вы владеете любым объектом, который создаете, когда

Вы создаете объект, используя метод, имя которого начинается с «alloc», «new», «copy» или «mutableCopy »(например, alloc, newObject или mutableCopy).

  • Когда он вам больше не нужен, вы должны отказаться от владения принадлежащим вам объектом

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

Для освобождения grid1 используйте [grid1 release];


Примечание. Нет причин оставлять / отпускать объект grid1 в цикле.Просто

B *grid1 = (B*)[myGrid objectAtIndex:i];
[self.view addSubview:grid1.view];

Я не знаю, что случилось с вашим кодом отдыха, но похоже, что у вас есть утечки памяти в другом месте.

...