代码之家  ›  专栏  ›  技术社区  ›  Ben Zotto sberry

保留/释放uipopovercontroller、uiactionsheet和模式视图控制器的模式?

  •  14
  • Ben Zotto sberry  · 技术社区  · 14 年前

    我对以下实例所需的对象所有权模式有些不清楚。当我的uiviewController显示一个Popover控制器、一个操作表或另一个视图控制器作为模式时,我是否需要保留对该子控制器的引用,直到它被取消?

    换句话说,下面的代码行是否有效地“转移”了所有权?

    [aPopoverController presentPopoverFromBarButtonItem:someButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:NO];
    
    [anActionSheet showFromBarButtonItem:someButtonItem animated:NO];
    
    [aViewController presentModalViewController:someOtherViewController animated:YES];
    

    有人能给我指一下这方面的明确文件吗?

    2 回复  |  直到 13 年前
        1
  •  26
  •   Willster justkt    13 年前

    uipopOverview控制器的内存管理/拥有略有不同。呈现Popover不会保留内存,因此无法将PopViewController的所有权转移到呈现对象。

    为了避免内存泄漏,您必须采用uipopOvercontrollerDelegate并实现didismissPopover方法,如下所示:

    - (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
        [popoverController release];
    }
    

    这样,您就可以安全分配并显示一个弹出窗口:

    -(void)showSearch:(id)sender {
        SearchViewController *searchVC = [[SearchViewController alloc] init];
        UIPopoverController *popVC = [[UIPopoverController alloc] initWithContentViewController:searchVC];
        popVC.delegate = self;
        [popVC setPopoverContentSize:CGSizeMake(320, 100)];
        [popVC presentPopoverFromRect:CGRectMake(200, 200, 320, 100) inView:self.view permittedArrowDirections:0 animated:YES];
        [searchVC release];
    }
    
        2
  •  1
  •   DougW    14 年前

    显示模式视图控制器将保留uiviewController。事实上,从文件中还不清楚这一点。但是,我用以下代码测试了它…

    NSLog(@"BEFORE %d", [self.setupViewController retainCount]);
    [self.navigationController presentModalViewController:self.setupViewController animated:YES];
    NSLog(@"AFTER %d", [self.setupViewController retainCount]);
    

    self.setupViewController已在本地保留,但显示它时会输出以下内容:

    2010-05-19 10:07:36.687 LocateMe[27716:207] BEFORE 1
    2010-05-19 10:07:36.762 LocateMe[27716:207] AFTER 3
    

    因此,它可能保留在本地ModalView控制器属性以及视图层次结构中。放弃它会平衡这些。

    所以底线是,如果你想直接控制它,就保留它,但你不必这样做。

    编辑-为了清楚起见, 对的 如果将自己设置为对象的代理,则模式将始终保留该对象。这是因为为了安全起见,您应该在DealLoc中将代理设置为零。实际上,模态控制器总是在您解除锁定之前被解除,所以这不是问题。你会注意到苹果在[uiview setAnimationDelegate]中也打破了这个规则,它实际上保留了你设置的代理。