iOS - 自定义 segue 内存泄漏

Posted

技术标签:

【中文标题】iOS - 自定义 segue 内存泄漏【英文标题】:iOS - Custom segue memory leak 【发布时间】:2013-05-22 18:09:08 【问题描述】:

我有两个视图控制器,带有一个由滑动手势识别器触发的自定义 segue。

自定义转场是这样的:

-(void)perform
UIViewController *sourceViewController = (UIViewController*)[self sourceViewController];
UIViewController *destinationController = (UIViewController*)[self destinationViewController];

CATransition* transition = [CATransition animation];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromRight;

[sourceViewController.navigationController.view.layer addAnimation:transition forKey:kCATransition];
[sourceViewController.navigationController pushViewController:destinationController animated:NO];

它可以工作,但每次都会增加内存,我找到了这个解决方案:how to clear memory of previous ViewController

但是,如果我在 viewController 名称中放置主 viewController,当我滑动时它会自动运行,如果我放置 secondViewController 名称,它会崩溃。

如何解决内存问题?非常感谢。

【问题讨论】:

您是否尝试过运行静态构建分析器?有时它会提供线索。 是的,没有问题。只有内存的增加。 如果您注释掉以下行,您是否仍然会遇到内存泄漏? CATransition* 过渡 = [CATransition 动画];过渡.type = kCATransitionPush; transition.subtype = kCATransitionFromRight; [sourceViewController.navigationController.view.layer addAnimation:transition forKey:kCATransition]; 在您的代码中看不到任何错误。你尝试过哪些事情?是否尝试过使用 performSegueWithIdentifier 和 prepareForSegue 方法进行常规 segue,以查看是否仍有内存泄漏?你知道泄漏是什么对象吗? 【参考方案1】:

如果我正确理解了您的问题,那么内存会随着每次 segue 的执行而增加是很自然的,因为就其本质而言,导航控制器会不断将您添加的每个新控制器推入其堆栈。这不是泄漏,因为您仍然可以从导航控制器堆栈中获取指向这些视图控制器的指针,并且当您丢失对部分内存的每个引用时就会发生泄漏。 使用导航控制器时,内存中的这种增量并没有逃脱,这是它的预期用途(但是,您可以释放每个源视图控制器正在使用的任何资源,并且可以在将新视图控制器推入堆栈之前在需要时重新创建) .

也许问题是您不想使用导航控制器?如果你能提供更多关于你想要完成的事情的细节,我可能会更有帮助。

【讨论】:

我同意@micantox。我观察到自定义 segue 的内存增长问题,但为了确保,我将自定义 segue 更改为 modal segue 并且内存增长仍然存在。

以上是关于iOS - 自定义 segue 内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

用于设置自定义字体的自定义字体的内存泄漏

键盘扩展内存泄漏?

调用 reloadData 时自定义 UITableViewCell 内存泄漏

自定义迭代器实现导致内存泄漏

程序化自定义单元内存泄漏问题

使用@tf.function 进行自定义张量流训练的内存泄漏