自定义iOS 7 UIViewController转换保留周期

时间:2013-11-12 06:56:33

标签: ios objective-c uiviewcontroller

我正在我的应用中创建自定义转换并遇到两个问题。如果我将视图控制器设置为同时处理UIViewControllerAnimatedTransitioningUIViewControllerTransitioningDelegate我遇到了我的视图控制器永远不会被释放的问题。具体来说,这会创建保留:

self.transitioningDelegate = self;

如果我不这样做,请将UIViewControllerAnimatedTransitioningUIViewControllerTransitioningDelegate放在一个名为TransitionController的单独NSObject中,并将其设置为:

self.transitioningDelegate = [[TransitionController alloc] init];

UIViewController 已取消分配,但我在TransitionController对象上遇到内存泄漏。现在有人在做我错的事吗?

4 个答案:

答案 0 :(得分:6)

我遇到了同样的问题并且能够解决它。
自定义转换API没有很好的文档记录,并且需要大量的试验和错误才能让我做好一切。

让我向您介绍一下如何在没有任何内存问题的情况下使其正常工作:

以下是球员:

VCA =想要以模态方式呈现VCB的视图控制器
VCB =模态呈现的视图控制器(由VCA提供)

TC =执行自定义动画的自定义转换控制器对象 NSObject子类符合“ UIViewControllerAnimatedTransitioning ”。
将在TD内实例化。

TD =为系统提供转换控制器的自定义转换委托对象。 符合“ UIViewControllerTransitioningDelegate ”的NSObject子类

现在让我们看一个VCB的实例

self = VCA的一个实例
myModalViewController =是自我的强大属性

self.myModalViewController = [[VCB alloc] init];

[self.myModalViewController setModalPresentationStyle: UIModalPresentationCustom];
[self.myModalViewController setTransitioningDelegate: [[TD alloc] init]];
[self presentViewController: self.myModalViewController
                   animated:YES 
                 completion:NULL];

稍后,VCB要求VCA被解雇

self = VCA的一个实例
myModalViewController =前面提到的VCB的模态呈现实例

[self dismissViewControllerAnimated:YES 
                         completion:^{
             [self.myModalViewController setTransitioningDelegate: nil]; // DO THIS!!!! 
             self.myModalViewController = nil;
        }];



我希望这会有所帮助。它确实对我有用。

答案 1 :(得分:2)

在我的情况下,我有自己(UIViewController)持有自定义UIViewController的实例(让我们称之为mViewController),而selftransitioningDelegate显示/解雇mViewConroller。我避免保留周期的解决方案是在.m mViewController 中调用它:

-(void)viewDidDisappear:(BOOL)animated {
    self.transitioningDelegate = nil;
    [super viewDidDisappear:animated];
}

像魅力一样工作(:

答案 2 :(得分:0)

在第二次尝试中,您正在分配一个TransitionController实例,它将永远不会被释放(因为没有人对它有引用)。 对象永远不应该在Objective-C中保留它的代理,因此您需要从代码的另一点引用ViewController及其delegate

答案 3 :(得分:0)

“{1}}对象由'来自'保留。在转换完成后,VC 在iOS7中完成(这不会发生在iOS8中),如果您的转换对象在属性中存储任何内容,则可能导致内存泄漏。这让我在过去,需要注意的事情。