0

私はクラス GameScene を持っています。その初期化中にシーンを作成し、それに子をアタッチします - レイヤー。私はそれのための奇妙なコードに気付きました:

    CCScene *scene = [CCScene node];
    CCLayer *layer = [GameScene node];
    [scene addChild:layer];

代わりにこれをしないのはなぜですか?

CCLayer *layer = [CCLayer node];

これは読みやすさに追加されませんか、ここで基本的な何かが欠けていますか? また、 alloc init をまったく使用しないのはなぜですか?

4

1 に答える 1

2
[CCNode node];

静的(クラス)メソッドです。自動的に呼び出します[[[self alloc] init] autorelease];

この静的初期化子を使用して、任意のCCNodeサブクラスを初期化できます。これは基本的に利便性のためであり、実際には必要ありません。(私が言ったように、持っているのはいいことですが)。

クラスメソッドは「+」記号を使用し、インスタンスメソッドは「-」記号を使用します。クラスメソッドは、Javaの静的メソッドに似ています。それらは、そのクラスのインスタンスを作成せずに呼び出すことができます。次のようになります。[YourClass doSomething]; //Doesn't need an instance of YourClass

インスタンスメソッドを実行するには、そのクラスのインスタンスが必要です。これは次のようになります。

YourClass *yClass = [[YourClass alloc] init];
[yClass doSomethingElse]; //Needs an instance of YourClass

私は見ていませんが、nodeメソッドは次のようになっていると思います。

+ (CCNode*)node {
    return [[[self alloc] init] autorelease];
}

奇妙な宣言は、カスタムレイヤーを子として持つシーン(静的初期化子で初期化されたもの)を返すだけで、CCDirectorが使用および表示できます。

編集:私が感じる何かが明快さを追加するでしょう。

+ (CCScene*)scene奇妙な宣言は、シーンを返す単なる静的初期化子です。

于 2012-07-23T17:22:28.020 に答える