Где мне выпустить CGMutablePath? - PullRequest
0 голосов
/ 06 февраля 2010

Я снова отправляю этот вопрос, но на этот раз я включаю полный код. Это очень долго, но здесь ничего не идет. Я не знаю, где выпустить thePath? Надеюсь, это последняя из моих утечек.

-(void)MoveObject:(int)Tag
    {   
        representationX = gameViewObj.spaceshipImageView.center.x;
        representationY = gameViewObj.spaceshipImageView.center.y;

        CALayer *spaceshipLayer = gameViewObj.spaceshipImageView.layer;
        shipAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
        CGMutablePathRef thePath = CGPathCreateMutable();
        CGPathMoveToPoint(thePath, NULL, representationX, representationY);
        statusFire = YES;
        BOOL parsedF = NO;

        if(Tag==LeftButtonTag)
        {   
            gameViewObj.spaceshipImageView.transform = CGAffineTransformMakeRotation(M_PI + M_PI_2);

            previousButtonTag = LeftButtonTag;
            representationX--;
            CGPathAddLineToPoint(thePath, NULL,representationX, representationY);

            parsedF = YES;
        }   
        else if(Tag==UpButtonTag)
        {
            gameViewObj.spaceshipImageView.transform = CGAffineTransformMakeRotation(0);

            previousButtonTag = UpButtonTag;
            representationY--;

            CGPathAddLineToPoint(thePath, NULL,representationX, representationY);

            parsedF = YES;
        }
        else if(Tag==RightButtonTag)
        {
            gameViewObj.spaceshipImageView.transform = CGAffineTransformMakeRotation(M_PI/2);

            previousButtonTag = RightButtonTag;
            representationX++;

            CGPathAddLineToPoint(thePath, NULL,representationX, representationY);

            parsedF = YES;
        }
        else if(Tag==DownButtonTag)
        {
            gameViewObj.spaceshipImageView.transform = CGAffineTransformMakeRotation(M_PI);

            previousButtonTag = DownButtonTag;
            representationY++;

            CGPathAddLineToPoint(thePath, NULL,representationX, representationY);

            parsedF = YES;
        }

        if(parsedF){

            shipAnimation.path = thePath;
            shipAnimation.delegate = self;
            shipAnimation.duration = 0.003;
            [spaceshipLayer addAnimation:shipAnimation forKey:@"position"];

            //To kill spaceship when moved backwards.
            if(playField[representationX][representationY]==3){

                [self doDie];
            }

            if(playField[representationX][representationY] == 2){

                if(onSecretLine){

                    [gameViewObj.spaceshipImageView setCenter:CGPointMake(representationX, representationY)];

                    oldPositionX = representationX;
                    oldPositionY = representationY;
                }
            }

            // case: breaking out
            if (playField[representationX][representationY]==0){
                if (onSecretLine){
                    if (statusFire)
                    {
                        availableOffline = YES;

                        oldPositionX=gameViewObj.spaceshipImageView.center.x;
                        oldPositionY=gameViewObj.spaceshipImageView.center.y;

                        [gameViewObj DrawLine];

                        onSecretLine = NO;
                        availableOffline = NO;
                    }
                }
            }

            if (playField[representationX][representationY]==0)
                if (!onSecretLine)
                {
                    BOOL doIt=true;

                    // ------------------------------
                    // prevent contact own line
                    // ------------------------------
                    // left 
                    if (Tag==LeftButtonTag) { 
                        if (playField[representationX-1][representationY]==3) {

                            [self doDie];
                            doIt=false;
                        }
                    }
                    // right 
                    if (Tag==RightButtonTag) { 
                        if (playField[representationX+1][representationY]==3) {

                            [self doDie];
                            doIt=false;
                        }
                    }
                    // up 
                    if (Tag==UpButtonTag) { 
                        if (playField[representationX][representationY-1]==3) {

                            [self doDie]; 
                            doIt=false;
                        }
                    }
                    // down 
                    if (Tag==DownButtonTag) {
                        if (playField[representationX][representationY+1]==3) {

                            [self doDie];
                            doIt=false;
                        }
                    }

                    // special things ...
                    if (doIt)
                    {
                        playField[representationX][representationY]=3;

                        [gameViewObj DrawLine];
                    }

                }

            // case: back to the secure line
            if (playField[representationX][representationY]==2)
                if (!onSecretLine)
                {               
                    [gameViewObj.spaceshipImageView setCenter:CGPointMake(representationX, representationY)];
                    availableOffline = NO;  
                    onSecretLine = YES;
                    [[NSNotificationCenter defaultCenter] postNotificationName:@"FindBirdCenter" object:nil];

                    for (int i=0; i<[gameViewObj.birdImageViewArray count]; i++) {
                        UIImageView* ImgBird=[gameViewObj.birdImageViewArray objectAtIndex:i];
                        int px=ImgBird.center.x;
                        int py=ImgBird.center.y;
                        // cristall point
                        playField[px][py]=5;
                    }

                    [self fillPlaygroundExtended];

                    //Elan function for filling area enclosed
                    [self fillAreaEnclosed:gameViewObj._myContext];

                    // invert ..
                    [self invertPlayground];

                    // turn the 3 into -> 20+
                    [self generateNewSecureLine];

                }

            if(Tag == UpButtonTag){

                [self moveShipUp];
            }

            else if(Tag == RightButtonTag){

                [self moveShipRight];
            }

            else if(Tag == DownButtonTag){

                [self moveShipDown];
            }

            else if(Tag == LeftButtonTag){

                [self moveShipLeft];

            }
            if(doScore == YES){
                [self calculateScore];
                doScore = NO;
            }
            [gameViewObj setNeedsDisplay];
        }
    }

1 Ответ

0 голосов
/ 06 февраля 2010

Фактически, если вы посмотрите на интерфейс CAKeyframeAnimation в CAAnimation.h, он объявит свое свойство path как,

@property CGPathRef path;

Поскольку по умолчанию используется свойство assign, вы не должны освобождать переменную thePath, если присваиваете ее shipAnimation.path . Выпускать его следует только в том случае, если вы не присвоили его shipAnimation.path .

Так что я бы сказал, что вы добавляете else к следующему циклу

if (parsedF) {
  ...
} else {
  CFPathRelease(thePath);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...