UIPoverController在每次使用时都会创建Live字节

时间:2011-12-04 13:38:39

标签: ios uipopovercontroller instruments

我在事件处理程序上弹出Popover控制器。每次调用此事件处理程序时,我的应用程序的内存占用量都会增加。一旦我关闭View控制器,我希望内存占用减少,但它永远不会发生。

我使用仪器中的分配工具来分析内存。

我在这里做错了吗?

-(IBAction)createNewAccount :(id) sender
{

    GSNewAccountViewController *createNewAccountVC = [[GSNewAccountViewController alloc]initWithNibName:@"GSNewAccountViewController" bundle:nil];        
    UIPopoverController *popover = 
    [[UIPopoverController alloc] initWithContentViewController:createNewAccountVC]; 

    popover.popoverContentSize = CGSizeMake(kScrollViewWidth, kScrollViewHeight);

    [popover presentPopoverFromRect:CGRectMake(770,-420,320,480) inView:self.view permittedArrowDirections: UIPopoverArrowDirectionUp animated:YES];

    popover.delegate = self;

    [createNewAccountVC release];


}

- (void)popoverControllerDidDismissPopover:
(UIPopoverController *)popoverController {

    [popoverController release];

}

更新

我将在它的ViewDidUnload方法中释放GSNewAccountController的所有Outlets。但即使我解雇了Popovercontroller,vieUnDIdload方法也没有被调用

1 个答案:

答案 0 :(得分:1)

当释放popoverController时,您应该检查是否正在发布您的GSNewAccountViewController。而不是监视Live Bytes的数量,检查生活的GSNewAccountViewController对象的#。要在分配工具中执行此操作,请转到“仪器”窗口的右上角,通过在文本字段中键入GSNewAccountViewController来过滤分配。然后检查每次触发IBAction时会发生什么。当你触发IBAction时,生命的#应该变为1,当释放popoverController时,它会返回到零。

如果生活的GSNewAccountViewController对象的数量永远不会变为零,那么您应该检查是否在GSNewAccountViewController类中创建了某种保留循环,这样会阻止调用dealloc和viewDidUnload方法。在保留周期中,GSNewAccountViewController保留一个对象,而该对象又保留了GSNewAccountViewController。由于两者都相互保留,因此不会调用它们的dealloc方法,也不会破坏对象。

要进行测试,请尝试创建一个非常简单的iPad项目,主视图上的按钮带有IBAction,以呈现带有viewController的popoverController,该视图从NIB加载,带有UITableViewController的普通vanilla子类。查看Allocations工具,它显示在popoverController被解除时显示和销毁popoverController时创建的子类。

祝你好运