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

标签 ios objective-c memory-leaks sprite-kit cgpath

使用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, 0, 10);

    for(int i = 2; i<self.frame.size.width; i+=2)
    {
        CGPathAddLineToPoint(path, nil, 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 后)。使用泄漏和分配工具,我发现了以下内容:

泄漏: Screenshot of Leaks window 分配: Screenshot of Allocations window

从图片中可以看出,有大量的Malloc调用占用内存。我没有直接调用 Malloc——这些调用似乎是由 SpriteKit 发出的。同样,也有一些内存泄漏,这似乎也是由于 SKShapeNode、SKNode 或其他 Sprite Kit 对象造成的。

我该如何变通或解决这个内存(泄漏)问题?我必须创建 SKShapeNodes 和每帧 SKNodes。此代码只是说明问题的示例 - 我的实际项目要复杂得多,具有动态生成的路径(不像本例中的那样是静态的)。

最佳答案

这是 sprite 工具包中的错误。问题不仅在于 SKShapeNode,还在于 SKPhysicsBody。

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

即使您正确释放路径,sprite kit 内部也不会。你无能为力!

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

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

关于ios - 为什么重复创建和删除SKShapeNode和SKNode会导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20292318/

相关文章:

javascript - 如何防止Chrome和Firefox长时间消耗大量内存?

objective-c - 如何使用 View Deck 使用导航栏推送 View

ios - UILabel 文本在两个字符串之间变化,每个字符串为 "touch up inside"

iphone - 使用 AudioQueueServices 同时播放 (10+)

ios - performActionForShortcutItem 与 applicationWillEnterForeground 的调用顺序

c++ - 了解 Valgrind 输出

objective-c - C代码中的内存泄漏

ios - Bootstrap 字体似乎在 Safari iOS 上被条纹化

ios - 方法 didSelectAnnotation 不起作用(Skobbler iOS)

ios - 如何使用 iOS Quartz 2D 绘图绘制这个复杂的形状?