Ошибка цели C: [BodyObject alloc]: нераспознанный селектор отправлен на экземпляр - PullRequest
1 голос
/ 20 февраля 2011

Я пытался использовать какую-то цель C, я дошел до создания пары объектов, и сейчас я пытаюсь их создать. Код компилируется без предупреждений, но когда он запускается, я получаю это в консоли:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:
'-[CCSprite copyWithZone:]: unrecognized selector sent to instance 0x6424ad0'

Я предполагаю, что где-то есть проблема с кодом, я нигде не вызываю метод copyWithZone

Вот код для игрового объекта:

gameobject.h

#import "cocos2d.h"
#import "Box2D.h"

@interface GameObject : NSObject {

    }

-(id) initWithSprite:(CCSprite*) sprite
         andVelocity:(b2Vec2*) velocity;

@property (nonatomic, copy) CCSprite *Sprite;
@property (nonatomic) b2Vec2 *Velocity;

@end

gameobject.mm

#import "cocos2d.h"
#import "GameObject.h"
#import "Box2D.h"

@implementation GameObject

@synthesize Sprite;
@synthesize Velocity;

-(id) initWithSprite:(CCSprite*) sprite
         andVelocity:(b2Vec2*) velocity
{
    self = [super init];

    self.Sprite = sprite;
    self.Velocity = velocity;

    return self;
}

@end

вот код для BodyObject:

BodyObject.mm

#import "BodyObject.h"


@implementation BodyObject

@synthesize Body;
@synthesize Fixture;

-(id) initWithBody:(b2Body*) body 
        andFixture:(b2Fixture*) fixture 
       andVelocity:(b2Vec2*) velocity 
         andSprite:(CCSprite*) sprite
{
    self = [super initWithSprite:(CCSprite*)sprite 
                     andVelocity:(b2Vec2*)velocity];

    self.Body=body;
    self.Fixture=fixture;

    return self;
}

@end

BodyObject.h

#import "GameObject.h"
#import "Box2D.h"
#import "cocos2d.h"

@interface BodyObject : GameObject {

}

@property (nonatomic) b2Body *Body;
@property (nonatomic) b2Fixture *Fixture;

-(id) initWithBody:(b2Body*) body 
        andFixture:(b2Fixture*) fixture 
       andVelocity:(b2Vec2*) velocity
         andSprite:(CCSprite*) sprite;

@end

И где я пытаюсь создать его экземпляр

BodyObject *bodyObject = [[BodyObject alloc] initWithBody:(b2Body *)body 
                                               andFixture:(b2Fixture *)fixture 
                                              andVelocity:(b2Vec2*) vector 
                                                andSprite:(CCSprite*) sprite];

Может кто-нибудь указать мне, где начать искать решение для этих типов ошибок или увидеть проблему с кодом? Я могу опубликовать больше классов, если требуется.

Спасибо

Ответы [ 3 ]

5 голосов
/ 20 февраля 2011

Это неправильно: self = [[super initWithSprite:(CCSprite*)sprite andVelocity:(b2Vec2*)velocity] alloc];

Правильная процедура: self = [super initWithSprite:(CCSprite*)sprite andVelocity:(b2Vec2*)velocity];

1 голос
/ 20 февраля 2011

Вероятной причиной этого сбоя является то, что CCSprite не соответствует NSCopying.Если вы реализуете NSCopying в CCSprite (предоставляя copyWithZone: метод) или изменяете свойство Sprite для сохранения, это аварийное завершение прекратится.

В качестве примечания, принятый стиль Objective C хмурится на любую переменную, начинающуюся сзаглавная буква.

1 голос
/ 20 февраля 2011

Если вы достигли точки в своем коде, где вызываются ваши пользовательские методы init, значит, ваш объект уже выделен, поэтому удалите все эти внешние вызовы для +alloc.

(Также,не имеет отношения, но соглашение, когда имена селекторов не включают, работает как и, или, и, но. Что-то вроде -initWithSprite:velocity: будет соответствовать соглашениям о присвоении имен Какао.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...