2012-04-19 4 views
0

У меня есть @property(nonatomic,retain) UIPopoverController * popoverController;UIPopover релиз IOS

Я создаю мой поповер в моем классе реализации.

Я использую это:

- (void)createPopover:(NavigationController *)tempNavigation { 

      UIPopoverController *tempPopover = [[UIPopoverController alloc] initWithContentViewController:tempNavigation]; 
      self.popoverController = tempPopover; 
      [self.popoverController setPopoverContentSize:CGSizeMake(width, height)]; 
      tempPopover.delegate = self;     

      CGRect selectedRect = [self.tableView rectForRowAtIndexPath:indexPath];    
      [tempPopover presentPopoverFromRect:selectedRect inView:self.tableView permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES]; 
      [tempPopover release]; 
} 

в этом методе я должен выпустить мой поповер

я использую это:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    if (popoverController) { 
     [popoverController dismissPopoverAnimated:NO]; 
     self.popoverController=nil; 
     [popoverController release]; 
    } 
    return YES; 
} 

Мой вопрос: это правильный путь, чтобы освободить поповер в этом метод. Или я должен освободить popover только в методе dealloc?

+0

Вы можете освободите сохраненный/выделенный объект в любом месте, если вы не пытаетесь получить доступ или освободить его снова. Так что это нормально – Lefteris

+0

Сначала вы устанавливаете свойство Nil, затем вы отпускаете переменную экземпляра - обе будут эффективно освобождать popover, следовательно вы можете удалить один или другой – Till

ответ

1
self.popoverController=nil; 

вызывает сеттер. Учитывая, что ваше свойство объявлено как сохранение, оно освободит предыдущее значение и сохранит новый (в этом случае он сохраняет нуль, который ничего не делает).

[popoverController release]; 

вызывает выпуск на popoverController, который теперь равен нулю, что ничего не делает. Однако вы не должны этого делать, если бы это было не ноль, он был бы выпущен (так как релиз будет вызван и в следующий раз, когда вы установите свойство popoverController).

У вас также есть проблема, когда вы установите свойство

UIPopoverController *tempPopover = [[UIPopoverController alloc] initWithContentViewController:tempNavigation]; 
self.popoverController = tempPopover; 

сеттер сохраняет значение, так что вы должны autorelease его

self.popoverController = [tempPopover autorelease]; 

И вы должны использовать ARC :)

+0

спасибо! Все понятно! –

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