0

我正在使用 SpriteKit 在 UICollectionView 中的 UICollectionViewCell 中制作动画。该场景有一个我正在使用 SKAction 制作动画的精灵。每个单元格的 contentView 都有自己的 SKView/SKScene。我遇到了内存泄漏。当我在 Xcode 6.3 的分配工具中查看这个时,我看到每个新单元格都有一对 > 1MB 的分配,一个归因于“SKView set_context”,另一个归因于 allocateWCMemory GLEngine”。

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

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

想法?

更新:

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

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

4

2 回答 2

0

不看代码就很难说,但是您应该寻找一件事:您的任何 SKAction 是否包含引用的块self?如果是这样,那可能会导致保留周期。在这种情况下,您将需要weak参考self(Swift 和 Objective C 之间会有所不同,但它们都需要它)可以在这篇文章中找到一个很好的解释(和体面的 Swift 示例) 。

于 2015-06-24T04:57:04.977 回答
0

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

该模式从 UINavigationController 呈现。使用这个桥接到 Swift 的 Objective-C 类,我发现有必要在行中添加:

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

当我解雇模态时。

于 2015-06-25T03:25:59.137 回答