孩子可以查看控制器“解雇自己吗?” .....
您有一个视图控制器“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?
答案 0 :(得分:13)
经过大量测试后,我们发现似乎是这样的情况:
它确实消失了并且没有被保留。
我们像这样在顶部添加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,否则将不会消失。
答案 1 :(得分:3)
这是比视图控制器包含更多的内存管理问题。不,你不需要把它放在那里,但是......
您假设您有对它的引用。问题是:它是否有很强的参考价值?如果是,那么你必须将它取消,因为该视图控制器不会被取消定位。测试它的最简单方法是使用日志消息向rm添加-dealoc方法。
答案 2 :(得分:2)
您的问答似乎有所不同。在您的叠加方法(回答)中,您没有将ViewController分配给任何强大的属性,而且您有强大的属性。我没有测试过代码,但我觉得你应该更新你的测试以获得强大的属性。
我认为理想情况下我们应该“取消”财产。否则,从堆栈是视图控制器将被删除。