Objective C中的分配和释放有多快?

时间:2011-07-05 17:06:56

标签: objective-c performance loops timer allocation

我知道这可能取决于你分配的对象有多大,但我只是想知道我是否继续以这种方式做事我以后会遇到问题。就目前而言,一切似乎都很好。我正在使用Cocos2D。

以此方法为例:

-(void) checkCGPointDistances{

    CCSprite *tempSp;

    CCLabelTTF *tempLabel;

    for(int i=0; i<hummingBirdsMax; ++i){

        tempSp = [hummingBirds objectAtIndex:i];

        checkDistance = [[CheckDistance alloc] init];

        if([checkDistance checkDistanceWithLimit:tempSp.position withPoint2:hero.heroSprite.position withLimit:150] == YES){

            if(hero.heroSprite.position.x > tempSp.position.x){
                tempSp.flipX = YES;
            }else{
                tempSp.flipX = NO;
            }

            tempLabel = [hummingLabels.labelsArr objectAtIndex:i];


            [tempLabel setString:@"Hello!"];

            [hummingLabels.deactivateLabelToggle replaceObjectAtIndex:i withObject:[NSNumber numberWithInt:1]];
        }

        [checkDistance release];

    }

    if(abilityRushH == 0){
        checkDistance = [[CheckDistance alloc] init];

        if([checkDistance checkDistanceWithLimit:rushH.rushHSprite.position withPoint2:hero.heroSprite.position withLimit:32] == YES){
            [rushH.rushHSprite removeFromParentAndCleanup:NO];

            abilityRushH = 1;
            NSLog(@"horizontal rush activated");
        }

        [checkDistance release];
    }

    if(abilityRushV == 0){
        checkDistance = [[CheckDistance alloc] init];

        if([checkDistance checkDistanceWithLimit:rushV.rushVSprite.position withPoint2:hero.heroSprite.position withLimit:32] == YES){
            [rushV.rushVSprite removeFromParentAndCleanup:NO];

            abilityRushV = 1;
            NSLog(@"vertical rush activated");
        }

        [checkDistance release];
    }
}

注意我是如何为for循环中的每个循环分配和释放checkDistance的?这种方法也很快在计时器上调用。我之所以决定在循环内外反复进行分配的原因是因为hummingBirdsMax的数量可能为0,所以根本不需要进行分配。我想我可以检查一下hummingBirdsMax&gt; 0,但我正在做的方式有很大的不同吗?

它分配的类只检查CGPoints之间的距离并返回一个bool。

1 个答案:

答案 0 :(得分:3)

你正在做的事情本身没有任何错误。如果没有在探查器(Shark或Instruments)中进行某些工作,则无法判断对象分配和释放是否是代码中的性能瓶颈。与所有性能优化决策一样,没有理由在没有一些数据的情况下进行推测。

也就是说,如果所有CheckDistance类都执行计算,那么它实际上不是一个对象(即封装状态和暴露行为)。为什么不将计算实现为C函数?与许多人习惯使用的托管Java / C#世界不同,并非所有内容都必须(也不应该是)类。