ios – removeFromParentViewController – 你以后需要零吗?

一个孩子的视图控制器可以自动关闭吗? …..

你有一个视图控制器“RedMessage”.你有一个普通的强大财产…

@property(强)RedMessage *红色;

添加它(“模态”)在您当前的VC …

self.red = (RedMessage *)[self.storyboard
     instantiateViewControllerWithIdentifier:@"RedMessageID"];
self.red.view.frame = self.view.frame;
[self.view addSubview:self.red.view];
[self addChildViewController:self.red];
[self.red didMovetoParentViewController:self];

为了摆脱它以后,这样做

[self.red willMovetoParentViewController:nil];
[self.red.view removeFromSuperview];
[self.red removeFromParentViewController];

但实际上,你需要这样做吗?

[rm willMovetoParentViewController:nil];
[rm.view removeFromSuperview];
[rm removeFromParentViewController];
rm = nil;

你需要“= nil”吗?

请注意,这个问题是至关重要的,因为:如果您没有将其删除,则可以在新的视图控制器中执行以下操作:

-(void)dismissMyselfCompletely
    {
    [self willMovetoParentViewController:nil];
    [self.view removeFromSuperview];
    [self removeFromParentViewController];
    }

这是非常方便的.

简而言之,如果你在新的顶视图控制器里面这样做 – 它会“工作”,它是否释放VC?

当removeFromParentViewController发生时,父VC了解它可以释放self.red吗?

解决方法

经过相当大的测试,我们发现似乎是这样的情况:

您实际上可以让VC“自己删除”.

它会消失,不会保留.

我们将VC顶部添加到这个顶部(只是在通常的方式你添加一个“模态”VC顶部…)

-(void)showOverlay:(NSDictionary*)dict
    {
    Red *rr = (Red *)[self.storyboard
        instantiateViewControllerWithIdentifier:@"RedID"];
    rr.view.frame = self.view.bounds;
    [self.view addSubview:rr.view];
    [self addChildViewController:rr];
    [rr didMovetoParentViewController:self];

    [rr useThisData:dict];
    }

注意,没有属性持有rr – 它刚刚创建并在该类别中即时添加.

里面的“红”我们摆脱它就像这样…

-(void)dismiss:(UITapGestureRecognizer *)sender
    {
    [self.view exitLeftSmoothly:0 then:^
        {
        [self willMovetoParentViewController:nil];
        [self.view removeFromSuperview];
        [self removeFromParentViewController];
        }];
    }

(exitLeft只是一个动画,不相关)

最后你可以这样测试:

-(void)viewDidAppear:(BOOL)animated
    {
    [super viewDidAppear:animated];
    ....
    [self _teste];
    }

-(void)_teste
    {
    Red __weak *mySelf = self;
    dispatch_after_secs_on_main(0.5,^
        {
        NSLog(@"tick !!!!!!!!!!!!");
        if ( mySelf == nil ) NSLog(@"I no longer exist - WTF!");
        [mySelf _teste];
        });
    }

你可以清楚地看到,一旦“红色”vc被解雇,确实,股票代码停止运行:“红色”已经消失.

它似乎工作可靠.你的输出会看起来像这样…

2014-10-22 17:26:36.498 [1738:111092] tick --- !!!!!!!!!!!!
2014-10-22 17:26:37.031 [1738:111092] tick --- !!!!!!!!!!!!
2014-10-22 17:26:37.576 [1738:111092] tick --- !!!!!!!!!!!!
2014-10-22 17:26:38.124 [1738:111092] tick --- !!!!!!!!!!!!
2014-10-22 17:26:38.674 [1738:111092] tick --- !!!!!!!!!!!!
2014-10-22 17:26:39.217 [1738:111092] tick --- !!!!!!!!!!!!
2014-10-22 17:26:39.764 [1738:111092] tick --- !!!!!!!!!!!!
2014-10-22 17:26:39.764 [1738:111092] I no longer exist --- WTF!

要重申,如AnujYadav指出,如果您在父VC中使用属性为“红色”…

@property (strong) Red *red;

然后

self.red = (Red *)[self.storyboard
 instantiateViewControllerWithIdentifier:@"RedID"];

确实这不行.在这种情况下,您必须在父母中self.red = nil,否则不会消失.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...