我在哪里发布CGMutablePath?

时间:2010-02-06 06:47:04

标签: ios memory-management

我再次发布此问题,但这次我要包含完整的代码。这是非常长的,但这里什么都没有。我不知道在哪里发布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 :(得分:0)

实际上,如果您查看CAAnimation.h中的CAKeyframeAnimation接口,它会声明其路径属性,如

@property CGPathRef path;

由于默认值是'assign'属性,因此如果将其分配给 shipAnimation.path ,则不应释放thePath变量。只有在未将其分配给 shipAnimation.path 的情况下,才应将其释放。

所以我会说你将 else 添加到你的后续循环

if (parsedF) {
  ...
} else {
  CFPathRelease(thePath);
}