【问题标题】:UIPopoverController and release in delegate-method; "potential memory leak"UIPopoverController 并在委托方法中释放; “潜在的内存泄漏”
【发布时间】:2011-05-25 09:22:38
【问题描述】:

我正在使用我的 UIPopoverController 进行分配/初始化,然后在委托方法中释放它。每当我执行“构建和分析”时,都会收到带有“潜在泄漏”的内存警告 - 我做错了什么还是有办法摆脱这些警告?

非常感谢!

- (void) somewhere {
    MyViewController *vc = [[MyViewController alloc] init];
    UIPopoverController *popover=[[UIPopoverController alloc] initWithContentViewController:vc];
    [vc release];

    // show the popover
    [popover presentPopoverFromRect:[cell frame] inView:self.tableView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    popover.delegate = self;
}

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

编辑:显示完整的某处功能

【问题讨论】:

    标签: ios memory-management uipopovercontroller


    【解决方案1】:

    首先,在popoverControllerDidDismissPopover: 方法中,您应该释放popoverController 实例,因为它将被框架释放。

    其次,那个somewhere方法是什么意思?你应该在这里发布完整的实现......我想你正在显示弹出视图,所以你应该做这样的事情:

    - (void) somewhere {
    
        // I suppose you have a local variable to hold the controller
        _myPopover = [[UIPopoverController alloc]   initWithContentViewController:vc];
        _myPopover .delegate = self;
    
        // ... do other things to configure the popover, if necessary
    
        // I suppose you show it, with something like this
        [_myPopover presentPopoverFromRect:yourRect inView:yourView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
    }
    

    然后,当您不再需要弹出框控制器时,您可以释放它。你可以试试你的代码,这样:

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

    这样,您将始终将弹出框的实例保存在您需要的位置,并在完成后释放它。在您之前的实现中,该实例未绑定到任何东西。

    【讨论】:

    • 不幸的是,这不起作用。你不能在那里释放 UIPopoverController ("popover")...
    • 如果您没有在课堂上本地保存popover 实例,则不再需要它。能否请您发布somewhere 的完整源代码?
    • 我还是不同意;如果我把版本放在那里,应用程序就会崩溃。来自其他 SO 问题:“UIPopoverController 的内存管理/拥有略有不同。呈现弹出框不会保留内存,因此您无法将 popviewcontroller 的所有权转移给呈现对象。”
    • 你是对的。我错了......我只是在不同的解决方案时更新了答案。请试一试?我建议你在课堂上本地保存弹出框控制器实例。
    猜你喜欢
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    相关资源
    最近更新 更多