Objective c NSInvalidArgumentException当我试图从另一个方法内部调用外部方法时

Objective c NSInvalidArgumentException当我试图从另一个方法内部调用外部方法时,objective-c,ios4,cocos2d-iphone,Objective C,Ios4,Cocos2d Iphone,我收到控制台消息: 2011-10-05 17:21:15.112 Fairstead[4986:207] -[CCSprite translate::::]: unrecognized selector sent to instance 0x546fdb0 2011-10-05 17:21:15.116 Fairstead[4986:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException',

我收到控制台消息:

2011-10-05 17:21:15.112 Fairstead[4986:207] -[CCSprite translate::::]: unrecognized selector sent to instance 0x546fdb0
2011-10-05 17:21:15.116 Fairstead[4986:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CCSprite translate::::]: unrecognized selector sent to instance 0x546fdb0'



   -(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
    {
        CGPoint touchLocation = [touch locationInView: [touch view]];
        touchLocation = [[CCDirector sharedDirector]convertToGL:touchLocation];
        touchLocation = [self convertToNodeSpace:touchLocation];

        [pc translate:300.0 :touchLocation :pc.position :pc]; //crash on this line

    }
以下是翻译方法:

-(void) translate:(float) objectVelocity: (CGPoint) translateLocation: (CGPoint) objectLocation:(DefaultObject *) sender
{
    CGPoint moveDifference = ccpSub(translateLocation, objectLocation);
    float distanceToMove = ccpLength(moveDifference);
    float moveDuration = distanceToMove / objectVelocity;

    [sender runAction:[CCMoveTo actionWithDuration:moveDuration position:translateLocation]];
}
方法与translate位于不同的类文件中

translate方法位于作为CCSprite子类的DefaultObject类文件中

pc是合成的,@性质是非原子的,保留


我缺少什么?

在方法定义和方法调用中都缺少参数标签

<>首先,我可以看到你来自哪里:在大多数编程语言中,包括但不限于C、C++、java等,一种方法的形式有:

float acceleration(float speed, float angle) { }
但是,Objective-C不同,因为您还需要标记参数:

- (float) accelerationFromSpeed:(float)speed andAngle:(float)angle { }
现在,objC初学者可能会问,既然我们已经命名了参数,为什么还要标记它们?考虑下面C++调用我们上面的第一个方法:

float result = obj->acceleration(23, 45);
现在让我问你,23和45指的是什么?您必须返回方法定义才能知道,例如,23是速度,45是角度。有些程序员甚至可能会执行以下操作:

float speed = 23;
float angle = 45;
float result = obj->acceleration(speed, angle);
尽管如此,当我们可以在Objective-C中执行以下操作时,为什么我们需要声明变量:

float result = [obj accelerationFromSpeed:23 andAngle:45];
您现在可以很容易地从方法调用本身就知道23和45的含义。无需返回或记忆方法定义头或声明变量

回到您的代码,您需要将您的方法定义标题修改为如下内容:

-(void) translate:(CGPoint)translateLocation  
     withVelocity:(float)objectVelocity 
andObjectLocation:(CGPoint)objectLocation 
        andSender:(DefaultObject *)sender
{
    CGPoint moveDifference = ccpSub(translateLocation, objectLocation);
    float distanceToMove = ccpLength(moveDifference);
    float moveDuration = distanceToMove / objectVelocity;

    [sender runAction:[CCMoveTo actionWithDuration:moveDuration position:translateLocation]];
}
并将其称为使用(为清晰起见,此处采用多行,但如果愿意,可以将其折叠为一行):

[pc      
         translate:touchLocation 
      withVelocity:300.0 
 andObjectLocation:pc.position 
         andSender:pc];