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];