0

カスタムクラスのタイプを作成するのに問題がありFrankます。私がそうするとき、私は次のエラーを受け取ります:

クラスメソッド'+initWithWorld ::'が見つかりません(戻り型のデフォルトは' id'です)

私のクラスは次のように定義されています:

@interface Frank : NSObject {
    PhysicsSprite *frankSprite;
    b2Body *body;

    float weight;
}

@property (readonly) b2Body *body;

-(void)initWithWorld:(b2World *) world :(CCNode *)parent;

-(void)moveLeft;
-(void)moveRight;

@end

私は次のようにオブジェクトを作成します:

frank = [Frank initWithWorld:world :self];

私は何が間違っているのですか?

4

2 に答える 2

3

最初にオブジェクトを割り当てる必要があります。

frank = [ [ Frank alloc ] initWithWorld: world :self ];

メソッドinitメンバーメソッド(幅は記号)です。つまり、クラスメソッド(記号を使用)ではなく、割り当てられたオブジェクトで-呼び出す必要があります。+

編集

@JustSidが指摘しているように、このようなinitメソッドはオブジェクト(type id)も返す必要があります。
したがって、正しいメソッドのプロトタイプは次のとおりです。

- ( id )initWithWorld: ( b2World * )world : ( CCNode * )parent;

その場合、実装は次のようになります。

- ( id )initWithWorld: ( b2World * )world : ( CCNode * )parent;
{
    if( ( self = [ self init ] ) )
    {
        /* Your initialisation here */
    }

    return self;
}
于 2012-10-08T21:27:15.403 に答える
1

initWithWorld::インスタンスメソッドではなく、クラスメソッドとして呼び出しています。あなたが必要です

frank = [[Frank alloc] initWithWorld:world :self];

このメソッド+allocは、新しく割り当てられたが初期化されていないレシーバーのインスタンス(この場合はクラスFrank)を返すクラスメソッドです。-initこのようなオブジェクトで実行できるのは、オブジェクトを初期化することだけです。これは、適切なメソッド(この場合は)を呼び出すことによって実行され-initWithWorld::ます。

于 2012-10-08T21:27:18.977 に答える