即使调用CGPathReleased,CGMutablePath也未释放

时间:2014-02-28 00:16:52

标签: objective-c

修改

显然它似乎是sprite kit / box2d中的一个错误:SKPhysicsBody bodyWithPolygonFromPath memory leaks

我太天真地认为苹果不会泄漏:D

CGMutablePathRef path = CGPathCreateMutable();

CGPathMoveToPoint(path, NULL, 3 * scale - offsetX, 44 * scale - offsetY);
CGPathAddLineToPoint(path, NULL, 69 * scale - offsetX, 52 * scale - offsetY);
CGPathAddLineToPoint(path, NULL, 80 * scale - offsetX, 14 * scale - offsetY);
CGPathAddLineToPoint(path, NULL, 45 * scale - offsetX, 2 *scale - offsetY);
CGPathAddLineToPoint(path, NULL, 1 * scale - offsetX, 16 *scale- offsetY);

CGPathCloseSubpath(path);

self.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
CGPathRelease(path);

我错过了什么吗?我释放了这个对象,但是有关内存泄漏的投诉......

75%

CGPathMoveToPoint(path, NULL, 3 * scale - offsetX, 44 * scale - offsetY);

25%

self.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];

2 个答案:

答案 0 :(得分:0)

Apple docs声明:“减少图形路径的保留计数”。是否释放路径是基于当前保留计数。如果其他东西保留了路径,那么它将不会被释放。还有什么可以保留这条道路,怎么样:

self.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];

如果您需要查看对象使用仪器的保留,释放和自动释放的位置:

在仪器中运行,在分配中设置“记录参考计数”(您必须停止记录以设置选项)。导致问题代码运行,停止记录,搜索感兴趣的ivar,向下钻取,您将能够看到所有保留,释放和自动释放发生的位置。

enter image description here

答案 1 :(得分:0)

几乎可以肯定你是在泄漏SKPhysicsBodyself,但也有可能你在其他地方提取路径并过度保留它。仪器只跟踪事物的分配时间。它无法检测到你在发布内容时犯了错误。因此,如果泄漏整个physicsBody,它将显示为“在代码的这个区域中分配的内存。”