【问题标题】:iPhone - dealloc subview UIViewController when removeFromSuperviewiPhone - removeFromSuperview 时释放子视图 UIViewController
【发布时间】:2023-04-07 04:45:01
【问题描述】:

我的主 UIViewController(主菜单)上有几个按钮,用于在主菜单顶部创建和添加子视图 UIViewController。当我删除子视图时,该控制器的内存不会被释放。如何立即释放该子视图内存?

有人有例子吗?这将解决我所有的问题!提前致谢。

这是我添加子视图的方法

if((UIButton *) sender == gameClassicBtn) {
        GameClassic *gameClassicController = [[GameClassic alloc] 
                             initWithNibName:@"GameClassic" bundle:nil]; 
        self.gameClassic = gameClassicController;
        [gameClassicController release]; 
        [self.view insertSubview:gameClassicController.view atIndex:1];
    }

【问题讨论】:

    标签: iphone memory memory-management uiviewcontroller dealloc


    【解决方案1】:

    根据您提供的代码,可能至少有两个位置保留了 UIViewController - 一个由视图层次结构 (self.view) 保留,另一个由成员变量 (self.gameClassic) 保留。听起来您只是在释放视图层次结构引用,而不是成员变量。如果你释放后者,它会释放 UIViewController 吗?

    【讨论】:

    • 我从不在主菜单代码中发布任何内容...上面的代码所在的位置。我不确定如何告诉该文件我已从视图中删除了 gameClassic.h。我通过 [self.view removeFromSubview] 删除该子视图;为了回到我的主菜单。
    • 基本上我的问题是我通过单击主菜单的按钮来插入子视图。短游戏结束后,我做了一个 removeFromSubview,该子视图的内存不会立即释放。因此,如果他们在主菜单上选择不同的按钮,它会加载另一个子视图,并且 objectalloc 会继续构建。
    • 我会暂时(强调暂时)在您的 GameClassic 类中覆盖保留和释放,并在每个类中放置一个断点。这样您就可以看到您的实例何时被保留和释放,从而让您找出需要删除额外引用计数的位置。
    • 我所有的 IBOutlets 都在我的 gameClass.m 文件的 -(void) dealloc 中释放。我知道我也不应该真正调用 [self dealloc]。建议构建一个 -(void) deletedView 函数,我可以调用该函数在删除FromSubview 之前从 gameClassic 中释放所有内容?
    • 我的建议是覆盖保留和释放以找出备用保留的来源,然后将其释放到适当的位置。这是在不添加不必要代码的情况下解决问题的最佳方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 2010-11-18
    相关资源
    最近更新 更多