【问题标题】:Releasing a popover which takes great amount of memory释放一个占用大量内存的弹出框
【发布时间】:2011-08-26 15:27:21
【问题描述】:

我正在使用弹出视图来呈现大量可供您选择的标志。 我的代码有问题,因为在我打开此弹出窗口后不久内存没有释放(视图控制器“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];
}

【问题讨论】:

  • 您的应用程序崩溃了吗?您是否有崩溃报告或错误消息?
  • 你在使用 popoverControllerDelegate 方法吗?

标签: ios objective-c memory-management popover


【解决方案1】:

使用 UIPopoverController 非常困难,但我通过将 Popover 控制器的委托设置为 self (popoverController.delegate = self) 并将 UIPopoverControllerDelegate 协议添加到您的类头来解决了这个问题

接下来,我实现了- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController委托方法,在这里我释放了popoverController并将其设置为nil。

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

请注意:如果您通过代码关闭弹出框(即使用dismissPopoverAnimated),则不会调用此委托方法,只有当该用户通过在弹出框外点击等方式关闭它时才会调用它。

【讨论】:

  • 谢谢,这不是问题,但您的回答使我的代码更加优雅和正确。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 2015-10-26
  • 2013-02-23
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
相关资源
最近更新 更多