выделить память для переменной, которая уже была выделена? - PullRequest
0 голосов
/ 06 февраля 2012

Я хочу выделить память для переменной, для которой я уже выделил. Например,

        self.m_tabbarController = [[TabbarController alloc] init];

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

  if(self.m_tabbarController != nil)
    {
      [self.m_tabbarController release];    
    }
             self.m_tabbarController = [[TabbarController alloc] init];

, но переменная self должна быть отключена в методе dealloc. Любая помощь, пожалуйста?авария?

   m_tabbarController = [[TabbarController alloc] init];
    [self.window addSubview:m_tabbarController ];
     [m_tabbarController release]; 

Ответы [ 4 ]

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

Первый релиз.Предполагая, что ваше синтезированное свойство равно retain, реализация будет обрабатывать для вас release:

self.m_tabbarController = [[[TabbarController alloc] init] autorelease];

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

Если это UIViewController, просто создайте новый UIViewController, потому что вам нужно много знать о реализации, всех подклассах и всех членах / ivars для правильной реализации повторной инициализации.Иногда вы можете сделать это с помощью его общедоступных свойств, иногда вы не сможете правильно инициализировать экземпляр.

Одна проблема с повторной инициализацией состоит в том, что то, что вы alloc, может не совпадать с возвращаемым - и вы можетеиначе не знаю, с каким типом ты имеешь дело конкретно во всех случаях.Правильная, исчерпывающая повторная реализация сложного типа добавляет много реализации (которая также имеет тенденцию быть транзитивной).

0 голосов
/ 06 февраля 2012
self.m_tabbarController = nil;
TabbarController *tempController = [[TabbarController alloc] init];
self.m_tabbarController = tempController;
[tempController release];
tempController = nil;
0 голосов
/ 06 февраля 2012

[self.m_tabbarController release]; выпустит m_tabbarController не self, поэтому

if(self.m_tabbarController != nil)
    {
      [self.m_tabbarController release];    
    }
self.m_tabbarController = [[TabbarController alloc] init];

абсолютно нормально

0 голосов
/ 06 февраля 2012

Вы должны объявить m_tabbarController с сохранением вида имущества.

Теперь измените ваш код, как показано ниже:

TabbarController *temp = [[TabbarController alloc] init];

self.m_tabbarController = temp;

[temp release];

Также добавьте m_tabbarController в метод dealloc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...