我有一个我在Xcode 5中创建的Sprite Kit游戏,当使用Instruments对其进行泄漏分析时,我发现确实存在一些泄漏:
问题在于我无法分辨出我的应用程序来自哪里,因为“负责框架”专栏并没有指出我的应用程序中的任何位置。
如何调试/跟踪此问题的根源?
更新#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
切换打开仪器中的右侧面板后,我能够看到有问题的线条(虽然我仍然不确定这里是不是错误):
第一组漏洞......
第二组泄漏......
答案 0 :(得分:2)
看起来它是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
如果你必须多次使用该路径,那么你可以保留对它的引用,这样你可以懒得加载它,然后只需加载一次。