ios – 为什么重复创建和删除SKShapeNode和SKNode导致内存泄漏?

前端之家收集整理的这篇文章主要介绍了ios – 为什么重复创建和删除SKShapeNode和SKNode导致内存泄漏?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用 Xcode附带的sprite kit模板,我修改场景如下:
#import "MyScene.h"

@interface MyScene ()
@property (nonatomic,strong)SKNode *floor;
@end

@implementation MyScene

-(id)initWithSize:(CGSize)size {    
    if (self = [super initWithSize:size]) {
        /* Setup your scene here */
    }
    return self;
}

-(void)update:(CFTimeInterval)currentTime {
    /* Called before each frame is rendered */
    [self removeAllChildren];
    self.floor = nil;
    self.floor = [SKNode node];

    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path,nil,10);

    for(int i = 2; i<self.frame.size.width; i+=2)
    {
        CGPathAddLineToPoint(path,i,10);
    }

    self.floor.physicsBody = [SKPhysicsBody bodyWithEdgeChainFromPath:path];
    SKShapeNode *shape = [SKShapeNode node];
    shape.path = path;
    shape.strokeColor = [UIColor redColor];

    [self.floor addChild:shape];
    [self addChild:self.floor];

    CGPathRelease(path); 
}

@end

该应用程序似乎继续使用更多内存,直到它挂起或崩溃(达到约180MB后).使用泄漏和分配工具,我发现了以下内容

泄漏:

分配:

从图像中可以看出,存在大量使用内存的Malloc调用.我不直接调用Malloc – 似乎这些调用是由SpriteKit完成的.同样,存在许多内存泄漏,这似乎也是由于SKShapeNode,SKNode或其他Sprite Kit对象造成的.

我如何解决解决此内存(泄漏)问题?我必须每帧创建SKShapeNodes和SKNodes.这段代码只是用来说明问题的一个例子 – 我的实际项目使用动态生成的路径要复杂得多(不像本例中那样是静态的).

解决方法

这是精灵工具包中的一个错误.问题不仅在于SKShapeNode,还在于SKPhysicsBody.

使用CGPath创建物理主体或形状会导致内存泄漏.
您可以通过注释物理主体或形状以及运行具有泄漏,分配和内存监视器的仪器来验证这一点.

即使您正确释放路径,sprite工具包也不在内部.你什么都做不了!

启动仪器,观察内存增长! XD

编辑:这个错误出现在iOS 7.0中.我是不是已经修复了7.1或更高版本,因为我已经停止使用SpriteKit因为这个bug.可以通过简单测试来验证它是否已修复.

猜你在找的iOS相关文章