8

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

self.transitioningDelegate = self;

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

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

解除分配UIViewController,但我在 TransitionController 对象上出现内存泄漏。有人现在我做错了吗?

4

5 回答 5

6

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

让我带你了解我是如何让它在没有任何内存问题的情况下正常工作的:

以下是球员:

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

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

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

现在让我们展示一个 VCB 的实例

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

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;
        }];



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

于 2013-12-29T19:34:59.100 回答
2

在我的情况下,我有 self( UIViewController) 持有一个自定义实例UIViewController(让我们称之为mViewController),并且selftransitioningDelegate显示/解雇的mViewConroller。我避免保留循环的解决方案是在.mof中调用它mViewController

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

像魅力一样工作(:

于 2014-01-19T15:30:00.057 回答
0

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

于 2013-11-12T08:14:25.057 回答
0

在 iOS7 中转换完成后,该UIViewControllerAnimatedTransitioning对象由 'from' VC 保留(这在 iOS8 中不会发生),如果您的转换对象在属性中存储任何内容,这可能会导致内存泄漏。这点我过去,要小心。

于 2015-05-14T02:27:04.587 回答
0

就我而言,导致我呈现的视图控制器保留的原因是我将错误的布尔值传递给了动画的完成块。

[transitionContext completeTransition:transitionContext.transitionWasCancelled];

应该是这样的:

BOOL successful = transitionContext.transitionWasCancelled == NO;
[transitionContext completeTransition:successful];

将代码分成两行有助于提高可读性。

于 2016-12-05T07:20:52.197 回答