【问题标题】:subview didn't call dealloc when superview(UIViewController) dealloc当superview(UIViewController)dealloc时子视图没有调用dealloc
【发布时间】:2011-07-12 14:43:50
【问题描述】:

我对 removeFromSuperview 的内存管理感到困惑。

这是我的代码:

MySubView *tMySubView = [[MySubView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
tMySubView.center = self.view.center;
tMySubView.tag = 1111;
[self.view addSubview:tMySubView];
[tMySubView release];

“self”是 UIViewController。

当“self”调用dealloc但MySubView没有调用dealloc时。

我知道 addSubView retainCount +1。

所以我尝试在“self” dealloc 中添加 [tMySubView removeFromSuperview]

并且调用了 MySubView dealloc...

我应该添加 [subView removeFromSuperview]; superView什么时候dealloc?

或者superView removeFromSuperview ,会自动调用subView的removeFromSuperview...?

我想不通。 :(

谢谢!

【问题讨论】:

    标签: iphone objective-c memory-management dealloc


    【解决方案1】:

    这意味着self.view没有正确释放。只有在被释放的情况下,它才会删除它的所有子视图。

    检查您的 loadView 方法(您可能在其中对其进行了初始化)。如果它看起来像这样:

    -(void) loadView {
       self.view = [[UIView alloc] init];
    }
    

    那么你有泄漏,必须像这样重写它:

    -(void) loadView {
       self.view = [[[UIView alloc] init] autorelease];
    }
    

    或

    -(void) loadView {
       UIView* v = [[UIView alloc] init];
       self.view = v;
       [v release];
    }
    

    同时检查您访问 self.view 的所有位置,并确保您没有过度保留它。

    【讨论】:

    • MyViewController *tMyViewController = [[[MyViewController alloc] init] autorelease]; [tNavigationController pushViewController:tMyViewController animated:YES];我是这样写的。
    • 不要混淆 viewcontroller 和它的 view。
    • 视图是如何创建的?在 loadView 中还是在 XIB 中?
    • 如果您从 xib 加载视图控制器,那么一切都会自动完成。您的代码中有该视图控制器的 loadView 吗?
    • 嗨~我在 viewDidLoad 中添加了 subView,由代码而不是 IB 生成。谢谢。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2013-08-18
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多