Sprite Kit应用程序中的内存泄漏

时间:2014-03-11 10:38:10

标签: ios ios7 memory-leaks instruments sprite-kit

我有一个我在Xcode 5中创建的Sprite Kit游戏,当使用Instruments对其进行泄漏分析时,我发现确实存在一些泄漏:

enter image description here

问题在于我无法分辨出我的应用程序来自哪里,因为“负责框架”专栏并没有指出我的应用程序中的任何位置。

如何调试/跟踪此问题的根源?

更新#1

只有一个文件我与CGPath进行交互,但我打电话给CGPathRelease

...
CGMutablePathRef path = CGPathCreateMutable();

CGPathMoveToPoint(path, NULL, 0, 0);
CGPathAddLineToPoint(path, NULL, size.width, 0);
CGPathAddLineToPoint(path, NULL, size.width, (upperCount * size.width));
CGPathAddLineToPoint(path, NULL, 0, (upperCount * size.width));

CGPathCloseSubpath(path);

upper.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];

CGPathRelease(path);
...        

更新#2

切换打开仪器中的右侧面板后,我能够看到有问题的线条(虽然我仍然不确定这里是不是错误):

第一组漏洞...... enter image description here

第二组泄漏...... enter image description here

2 个答案:

答案 0 :(得分:2)

你看到了这个吗? SKPhysicsBody bodyWithPolygonFromPath memory leaks

看起来它是SKPhysicsBody中的spritekit错误(我猜它会保留在bodyWithPolygonFromPath中但未发布)。

答案 1 :(得分:0)

嗯......我真的不确定这里发生了什么。但是,是否可以使用UIBezierPath来尝试创建路径。

只是为了测试它......

CGMutablePathRef path = CGPathCreateMutable();

CGPathMoveToPoint(path, NULL, 0, 0);
CGPathAddLineToPoint(path, NULL, size.width, 0);
CGPathAddLineToPoint(path, NULL, size.width, (upperCount * size.width));
CGPathAddLineToPoint(path, NULL, 0, (upperCount * size.width));

CGPathCloseSubpath(path);

upper.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];

CGPathRelease(path);

会变成......

UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(0, 0)];
[path addLineToPoint:CGPointMake(size.width, 0)];
[path addLineToPoint:CGPointMake(size.width, (upperCount * size.width))];
[path addLineToPoint:CGPointMake(0, (upperCount * size.width))];
[path closePath];

upper.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path.CGPath];

看看是否能阻止泄漏。如果是这样的话......保持:D

如果你必须多次使用该路径,那么你可以保留对它的引用,这样你可以懒得加载它,然后只需加载一次。