我正在我的应用中创建自定义转换并遇到两个问题。如果我将视图控制器设置为同时处理UIViewControllerAnimatedTransitioning
和UIViewControllerTransitioningDelegate
我遇到了我的视图控制器永远不会被释放的问题。具体来说,这会创建保留:
self.transitioningDelegate = self;
如果我不这样做,请将UIViewControllerAnimatedTransitioning
和UIViewControllerTransitioningDelegate
放在一个名为TransitionController的单独NSObject
中,并将其设置为:
self.transitioningDelegate = [[TransitionController alloc] init];
UIViewController
已取消分配,但我在TransitionController对象上遇到内存泄漏。现在有人在做我错的事吗?
答案 0 :(得分:6)
我遇到了同样的问题并且能够解决它。
自定义转换API没有很好的文档记录,并且需要大量的试验和错误才能让我做好一切。
让我向您介绍一下如何在没有任何内存问题的情况下使其正常工作:
VCA =想要以模态方式呈现VCB的视图控制器
VCB =模态呈现的视图控制器(由VCA提供)
TC =执行自定义动画的自定义转换控制器对象
NSObject子类符合“ UIViewControllerAnimatedTransitioning ”。
将在TD内实例化。
TD =为系统提供转换控制器的自定义转换委托对象。 符合“ UIViewControllerTransitioningDelegate ”的NSObject子类
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];
self = VCA的一个实例
myModalViewController =前面提到的VCB的模态呈现实例
[self dismissViewControllerAnimated:YES
completion:^{
[self.myModalViewController setTransitioningDelegate: nil]; // DO THIS!!!!
self.myModalViewController = nil;
}];
我希望这会有所帮助。它确实对我有用。
答案 1 :(得分:2)
在我的情况下,我有自己(UIViewController
)持有自定义UIViewController
的实例(让我们称之为mViewController
),而self
是transitioningDelegate
显示/解雇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中),如果您的转换对象在属性中存储任何内容,则可能导致内存泄漏。这让我在过去,需要注意的事情。