目标c-精灵套件节点没有从内存中移除



我的精灵套件游戏一直存在内存问题,我已经尽了一切努力来解决它,但仍然一无所获。关于这个问题的一些背景;第一次玩游戏时,记忆力很好,完全稳定。但当你死了,又开始玩游戏的时候,记忆就开始慢慢浮现了。似乎你再次玩得越多,记忆就越快。你可以在任何一个场景中,使用的记忆仍然会攀升。这是一张展示乐器的图片,http://postimg.org/image/5olu8h7tp/.

这是我的代码:

创建对象:

 -(void)createObstacle0 {
int yMin = (CGRectGetMidY(self.frame)+190);
int yMax = (CGRectGetMidY(self.frame)+270);
CGPoint startPoint = CGPointMake(-20, yMin + arc4random_uniform(yMax - yMin));
SKSpriteNode *obstacle = [SKSpriteNode spriteNodeWithImagedNamed:@"obstacle"];
obstacle.position = CGPointMake(startPoint.x, startPoint.y);
obstacle.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:21];
obstacle.physicsBody.categoryBitMask = enemyCategory;
obstacle.physicsBody.contactTestBitMask = playerCategory;
obstacle.physicsBody.dynamic = NO;
obstacle.name = @"obstacle";
[self addChild:obstacle];
SKAction *move = [SKAction moveTo:CGPointMake(340, startPoint.y) duration:minTime +arc4random_uniform(maxTime - minTime)];
SKAction* removeObstacle = [SKAction removeFromParent];
[obstacle runAction:[SKAction sequence:@[move, removeObstacle]] completion:^{
    score++;
    scorelabel.text = [NSString stringWithFormat:@"%lu",(unsigned long)score];
}];
float randomNum = arc4random_uniform(3.0) + 0.2;
[self performSelector:@selector(createObstacle0) withObject:nil afterDelay:randomNum];
}

碰撞检测器和场景转换:

-(void)didBeginContact:(SKPhysicsContact *)contact
{
uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);
if (collision == (playerCategory | enemyCategory)) {
playerAlive = NO;
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setInteger:score forKey:@"playerScore"];
    [defaults synchronize];
    int highScore = [[[NSUserDefaults standardUserDefaults] objectForKey:@"High Score"] integerValue];
    if (highScore){
        if (highScore < score){
            [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:score] forKey:@"High Score"];
        }
    }
    else{
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:score] forKey:@"High Score"];
    }
    [[NSUserDefaults standardUserDefaults] synchronize];

    SKTransition *reveal = [SKTransition fadeWithDuration:0.75];
    MGLCreateGameOverScene *scene = [MGLCreateGameOverScene sceneWithSize:self.view.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;
    [self.view presentScene:scene transition:reveal];
}
}

删除剩余节点:

-(void)update:(CFTimeInterval)currentTime {
if (playerAlive == NO) {

    [self enumerateChildNodesWithName:@"obstacle" usingBlock:^(SKNode *node, BOOL *stop) {
        [node removeFromParent];
    }];
}
}

正如我之前所说,当你第一次玩游戏时,记忆会保持完全稳定。只有在第一次之后,记忆才会开始上升。似乎你越是重新访问主游戏场景,记忆就越快。我真的需要帮助来解决这个问题,我的比赛已经两周了,我真的很想恢复。我感谢大家的帮助。

您的问题是线路:

[self performSelector:@selector(createObstacle0) withObject:nil afterDelay:randomNum];

此方法实际上保留self(通过创建计时器(,直到执行选择器之后。您需要做的是在更改场景之前向方法didBeginContact:添加以下行:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(createObstacle0) object:nil];

这将破坏保持自我并无休止地调用该方法的计时器。

您可以通过在场景的dealloc方法中添加对NSLog(@"%s", __PRETTY_FUNCTION__);的调用来检查这是否有效。

最新更新