我知道这可能取决于你分配的对象有多大,但我只是想知道我是否继续以这种方式做事我以后会遇到问题。就目前而言,一切似乎都很好。我正在使用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。
答案 0 :(得分:3)
你正在做的事情本身没有任何错误。如果没有在探查器(Shark或Instruments)中进行某些工作,则无法判断对象分配和释放是否是代码中的性能瓶颈。与所有性能优化决策一样,没有理由在没有一些数据的情况下进行推测。
也就是说,如果所有CheckDistance
类都执行计算,那么它实际上不是一个对象(即封装状态和暴露行为)。为什么不将计算实现为C函数?与许多人习惯使用的托管Java / C#世界不同,并非所有内容都必须(也不应该是)类。