views:

106

answers:

1

I'm posting this question again but this time I'm including the full code. It's extremely long, but here goes nothing. I don't know where to release thePath? I believe it's the last of my leaks, hopefully.

-(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];
        }
    }
A: 

Actually if you look at CAKeyframeAnimation interface in CAAnimation.h, it declares its path property like,

@property CGPathRef path;

Since the default is an 'assign' property, you shouldn't release the thePath variable if you assign it to shipAnimation.path. You should release it only in case where you don't assign it to shipAnimation.path.

So I would say you add an else to your following loop

if (parsedF) {
  ...
} else {
  CFPathRelease(thePath);
}
Deepak
I will definitely try that thank you!
NextRev