我使用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/SKWiew仍在分配(每个集合视图单元),但我只是不设置精灵的动画。我还应该补充一点,在这种情况下,在禁用动画的情况下,我会在应该命中的地方命中所有解除分配断点(例如,UICollectionViewCell deinit方法)。
2) 现在我已经添加了动画,但我只做了一个循环。我一直在做重复的动画(同样的动画,只是重复,用计时器控制)。当我只做一次并停止时,没有内存泄漏。所以,这个问题似乎源于我重复的动画。
如果不看代码,很难判断,但有一件事你应该寻找:您的任何SKActions是否包含引用self
的块?如果是这样,可能会导致保留周期。在这种情况下,您需要获得对self
的weak
引用(Swift和Objective C之间的引用不同,但它们都需要)在这篇文章中可以找到一个很好的解释(以及不错的Swift例子)。
此内存泄漏似乎与SpriteKit或集合视图无关。我在模态视图控制器中展示了UICollectionView,而(ObjectiveC)模态有一个问题,似乎只是在将其连接到Swift时才出现。未释放包含的模式视图控制器。因此,它包含的对象(例如UICollectionView,以及其中的SKView/SKScene)没有被解除分配。
该模式从UINavigationController中呈现。使用这个连接到Swift的Objective-C类,我发现有必要添加以下行:
// popupNavController is the UINavigationController used to present the modal view controller
self.popupNavController.viewControllers = nil;
当我驳回模态时。