当我使用自定义形状创建Sprite Kit物理体时,出现了奇怪的内存泄漏。这是我的实现方式:
CGFloat offsetX = self.frame.size.width * self.anchorPoint.x;
CGFloat offsetY = self.frame.size.height * self.anchorPoint.y;
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 4 - offsetX, 3 - offsetY);
CGPathAddLineToPoint(path, NULL, 66 - offsetX, 3 - offsetY);
CGPathAddLineToPoint(path, NULL, 35 - offsetX, 57 - offsetY);
CGPathCloseSubpath(path);
self.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
CGPathRelease(path);
所有的操作都在SKSpriteNode
方法内执行。创建这些物体之后,Instruments告诉我有几个内存泄漏:
Leaked object:
Malloc 32 Bytes
Size:
32 Bytes
Responsible Library:
PhysicsKit
Responsible Frame:
std::__1::__split_buffer<PKPoint, std::__1::allocator<PKPoint>&>::__split_buffer(unsigned long, unsigned long, std::__1::allocator<PKPoint>&)
CGPathRelease(path);
这一行是必要的 - 如果没有它,我会得到更多有关CGPath
的内存泄漏问题,这是可以理解的。当我使用这种实现(用于测试目的)时:
CGFloat radius = MAX(self.frame.size.width, self.frame.size.height) * 0.5f;
self.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:radius];
一切都运作良好,没有内存泄漏。我想知道这是Sprite Kit的错误还是我做错了什么。
[SKPhysicsBody bodyWithPolygonFromPath:]
,[PKPhysicsBody bodyWithPolygonFromPath:]
,[PKPhysicsBody initWithPolygonFromPath:]
,[CGPathApply]
,CG::Path::Sequence::apply
,CG::Path::Subpath::apply
,CG::Chunk::apply
,::adaptor::callback
,PKPathApplyCGPath
,std::__1::vector::__push_back_slow_path
,std::__1::__split_buffer::__split_buffer
. - Joseph Mansfield