【问题标题】:Memory Leak in Sprite Kit ApplicationSprite Kit 应用程序中的内存泄漏
【发布时间】:2014-04-14 21:57:52
【问题描述】:

我有一个在 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

在 Instruments 中打开右侧面板后,我能够看到违规行(尽管我仍然不确定这里是否错了):

第一组泄漏...

第二组泄露...

【问题讨论】:

  • 如果我没记错的话,CGPaths & Co 是“旧的”和新的 CGRelease。
  • 使用静态分析器找到它们
  • @Fogmeister 我在 Xcode 中运行了静态分析器,但它返回没有问题
  • @Larme 我不确定你的意思。我用我正在使用路径的地方更新了我的问题,但我认为我正确地发布了它。这不是我想要的还是我做错了?
  • 使用 CGPathRelease,它似乎是正确的。我只是假设对于所有 ARC 的东西,您可能已经忘记手动执行此版本。您是否使用 Memory Leak Instrument 知道它从哪条线路泄漏?在右侧显示面板并双击泄漏。

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


【解决方案1】:

你见过吗? SKPhysicsBody bodyWithPolygonFromPath memory leaks

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

【讨论】:

  • 此错误是否已报告给 Apple?
【解决方案2】:

嗯...我真的不确定这里发生了什么。但是,是否可以尝试使用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

如果您必须多次使用该路径,那么您可以保留对它的引用,以便您可以延迟加载它,然后只需加载一次。

【讨论】:

  • 这并没有解决它(虽然看起来更干净)。移动到初始点以及将路径分配给物理体时,仍然会发生泄漏。
  • 听起来好像不是 CGPath 泄漏了。反正不在这里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多