размещение в уже выделенной переменной в iphone SDK - PullRequest
0 голосов
/ 09 февраля 2012

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

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

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

  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]; 

Ответы [ 2 ]

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

Попробуйте это

в .h объявляют "my_tabBarController",

@property(nonatomic,retain)my_tabBarController;

дюйм. М

@synthesize my_tabBarController;

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

 TabbarController *secondTabBar=[[TabbarController alloc]init];
 self.my_tabBarController=secondTabBar;
 [secondTabBar release];

и не забудьте выпустить my_tabBarController в dealloc

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

Для перераспределения @property типа (retain) вы не должны освобождать его явно

//this is wrong
if(self.m_tabbarController != nil)
    {
      [self.m_tabbarController release];    
    }
/////////////////////

только эта строка будет нормально работать для перераспределения.

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

Причина в том, что -> для свойства (retain), когда мы делаем self.obj = nil или (новое размещение), это означает

[obj release];
obj = nil or (new allocation)

Ваше приложение аварийно завершает работу, поскольку m_tabbarController сталкивается с двойным выпуском из-за явного и неявного выпуска как в первый раз вы явно вызываете release по [self.m_tabbarController release];, а следующее неявное освобождение происходит во время присваивания self.m_tabbarController = [[TabbarController alloc] init];

...