集合视图单元格中 SpriteKit 的内存泄漏

Memory leak with SpriteKit in Collection View Cells

我正在使用 SpriteKit 在 UICollectionView 的 UICollectionViewCell 中制作动画。该场景有一个精灵,我正在使用 SKAction 对其进行动画处理。每个单元格的 contentView 都有自己的 SKView/SKScene。我 运行 陷入内存泄漏。当我在 Xcode 6.3 的 Allocations Instrument 中查看这个时,我看到每个新单元格都有一对 > 1MB 的分配,一个归因于 "SKView set_context",另一个归因于 allocateWCMemory GLEngine"。

在每个 UICollectionViewCell 中,它都是非常标准的东西。我正在创建其他(与动画无关)UIView 子视图并将它们添加到 contentView。

一件奇怪但可能相关的事情是我没有得到始终调用的 UICollectionViewCell 的 deinit 方法。

想法?

更新:

1) 这似乎与动画直接相关,与集合视图关系不大。如果我只是关闭代码的动画部分,我似乎不会发生内存泄漏。或者至少没有那么多内存泄漏。在这种情况下,SKScene/SKView 仍在分配(每个集合视图单元格),但我只是不为精灵设置动画。我还应该补充一点,在这种情况下,在禁用动画的情况下,我会在应该命中的位置命中所有释放断点(例如,UICollectionViewCell deinit 方法)。

2) 现在我已经重新添加了动画,但我只做了一个循环。我一直在做重复的动画(相同的动画,只是重复,用计时器控制)。当我只执行一次并停止时,没有内存泄漏。所以,问题似乎源于我重复的动画。

如果不看代码,很难说清楚,但您应该寻找一件事: 您的任何 SKActions 是否包含引用 self 的块?如果是这样,那可能会导致保留周期。在这种情况下,您将需要获得对 selfweak 引用(Swift 和 Objective C 之间会有所不同,但它们都需要它) 可以在 this post.

中找到一个很好的解释(和体面的 Swift 示例)

此内存泄漏似乎与 SpriteKit 或 Collection Views 几乎没有关系或根本没有关系。我在模态视图控制器中呈现 UICollectionView,并且那个 (Objective C) 模态有一个问题,似乎只有在将它桥接到 Swift 时才会出现。包含模态视图控制器未被释放。因此,它包含的对象(例如 UICollectionView,以及其中的 SKView/SKScene)没有被释放。

该模态来自 UINavigationController。使用桥接到 Swift 的 Objective-C class,我发现有必要在行中添加:

// popupNavController is the UINavigationController used to present the modal view controller
self.popupNavController.viewControllers = nil;

当我关闭模态时。