我正在使用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)现在我已经重新添加了动画,但我只是做了一个循环。我一直在做重复的动画(相同的动画,只是重复,用计时器控制)。当我这样做一次并停止,没有内存泄漏。所以,问题似乎源于我重复的动画。
答案 0 :(得分:0)
不看代码很难说,但有一件事你应该寻找:
您的任何SKActions是否包含引用self
的块?如果是这样,那可能会导致保留周期。在这种情况下,您需要获得weak
self
的引用(Swift和Objective C之间会有所不同,但它们都需要它)
可以在this post中找到一个很好的解释(以及不错的Swift示例)。
答案 1 :(得分: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;
当我解雇模态时。