Выпуск поповера, который занимает много памяти - PullRequest
0 голосов
/ 26 августа 2011

Я использую всплывающее окно для представления большого количества флагов, которые вы можете выбрать. Что-то не так с моим кодом, так как вскоре после открытия этого всплывающего окна память не освобождается (viewcontroller "flagsViewController" в порядке и чист, он инициализирует и освобождает каждый элемент внутри него.

Что я делаю не так? Как я могу освободить память, как только закрывается поповер?

    -(void)presentFlags
    {
        [self.popoverController dismissPopoverAnimated:YES];

        FlagsViewController *controller = [[FlagsViewController alloc] 
                                            initWithNibName:@"FlagsViewController" 
                                            bundle:[NSBundle mainBundle]] ;

        UINavigationController *container = [[UINavigationController alloc] initWithRootViewController:controller];

        UISegmentedControl *ctrl = [[UISegmentedControl alloc] initWithItems:segmentedItems];
        ctrl.frame = CGRectMake(0, 6, 500, 30);
        [ctrl addTarget:self action:@selector(changeSeg:) forControlEvents:UIControlEventValueChanged];
        ctrl.segmentedControlStyle = UISegmentedControlStyleBar;
        //ctrl.momentary = YES; 
        ctrl.tintColor  = [UIColor darkGrayColor];
        UIImage *theImage = [UIImage imageNamed:@"highlight_country.png"];

        [ctrl setImage:theImage forSegmentAtIndex:0];

        [container.navigationBar addSubview:ctrl];
        [ctrl release];
        //
        //create a popover controller
        self.popoverController = [[[UIPopoverController alloc]
                                   initWithContentViewController:container] autorelease];
        [container  release];
        [popoverController setPopoverContentSize:CGSizeMake(500, 600)];
        //present the popover view non-modal with a
        //refrence to the button pressed within the current view
        [popoverController presentPopoverFromRect:CGRectMake(popoverArrowPossition, 0.0, 0.0, 52.0) inView:super.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
        [controller release];
}

1 Ответ

2 голосов
/ 26 августа 2011

Работа с UIPopoverController была довольно сложной, но я решил эту проблему, выполнив следующую настройку делегата контроллера поповера на себя (popoverController.delegate = self) и добавив протокол UIPopoverControllerDelegate в заголовок вашего класса

ДалееЯ реализовал метод делегата - (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController и здесь я выпустил popoverController и установил для него значение nil.

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
    [self.popoverController release];
    self.popoverController = nil;
}

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

...