我在事件处理程序上弹出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方法也没有被调用
答案 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时创建的子类。
祝你好运