2

以下のコードを使用して、サブクラス化された SKNode オブジェクトの便利なメソッドを作成しています。これはうまく機能しているようです。私を悩ませているのは、SKNode Class Reference が明示的に -init シンボルが iOS 8.0 以降でのみ使用可能であると述べていることです。私のアプリの展開ターゲットは iOS 7.1 です。

+ (instancetype)postGameContent
{
    return [[self alloc] init];
}

- (id)init
{
    if (self = [super init]) {

        [self setupContent];

    } return self;
}

私のコードの init メソッドが iOS7.1 の継承チェーンに転送され、SKNode 独自の便利なメソッド (+ ノード) または初期化子 (- init) によって初期化されたものをバイパスするのではないかと心配しています。iOS のバージョン番号によって、私のコードが多少異なるノード (またはオブジェクト) になる可能性はありますか? これに関連して、私が書くとき:

return [[self alloc] init];

Xcode 6 のオートコンプリートは、理由を説明せずに「init」に赤い取り消し線を付けます (スクリーンショット)。これは潜在的なバージョンの問題によるものですか、それとも他の理由でしょうか?

4

2 に答える 2

2

init メソッドをオーバーライドする代わりに、便利なメソッド自体で必要な操作を実行できます。

+ (instancetype)postGameContent
{
    MyNode* node = [super node]; //Create node from superclass, i.e. SKNode
    [node setupContent]
    return node;
}

これにより、実際にはバージョンの互換性に関してさらに安全になります。

于 2014-10-28T06:21:07.407 に答える
0

これが私が見つけたものです:

  • クラス メソッド [SKNode node] は init を呼び出します。これにより、上記のコードは潜在的なバイパスや適切なノード初期化の欠落に関して安全になります。
  • iOS バージョン間での「ノードの一貫性」に関して言えば、これはあまり役に立ちません。SKNode クラスは iOS 8 でメジャー リビジョンの対象になっているからです。

これが私が見つけた方法です:

- init シンボルが iOS 8 バージョンでしか使用できない場合、少なくとも iOS 7 では、SKNode のクラス ファクトリ メソッドが init 以外の別のイニシャライザを呼び出したことを意味します。これをテストするために、便利なメソッドで alloc init を node に置き換えて、 init メソッドにログ メッセージを追加しました。

+ (instancetype)postGameContent
{
    return [self node];
}

- (id)init
{
    if (self = [super init]) {

        NSLog(@"init called!");

    } return self;
}

ここで、ノード メソッドが init を呼び出すと、サブクラス イニシャライザが教えてくれます。これは、iOS 8 と iOS 7 の両方で行われました。私の目には、これにより、クラス リファレンスの明示的な iOS 8 固有の init シンボルが冗長になります。間違っている場合は修正してください。

新しいイニシャライザ、プロパティ、およびメソッドに加えて、iOS 8 SKNode クラスでは、hash および isEqual メソッドの実装も変更されました。これにより、コレクション物理を含むさまざまな方法で奇妙な動作が発生しました。これは、どちらの方法でも、iOS 7 ノードが iOS 8 で異なる動作をする可能性があることを意味します。

なぜ赤い取り消し線なのか、わかりません。Apple DTS に関するリクエストがあり、それについて何か聞いたら報告します。

更新:私はカリフォルニアの聖なる教会と連絡を取り合っています。混乱は、私に代わっての誤解に基づいていました。私は、技術的にも API コントラクトに準拠していても、 alloc] init] プロセスを使用して任意のオブジェクトを初期化できると想定しました。たとえば、次のようになります。

SKNode *node = [[SKNode alloc ] init];

この仮定は間違っています。フレームワーク リファレンスで指定されている初期化子を常に使用する必要があります。これは、iOS 7.1 以前の場合、SKNode オブジェクトを初期化する方法が 1 つしかないことを意味します。つまり、+node シンボルを使用します。iOS 7 の SKNode クラスで init がオーバーライドされていることがわかっている場合でも、init を使用して SKNode を初期化することが技術的に可能であることは重要ではありません。これは API コントラクトを破ります。

于 2014-10-31T20:36:21.920 に答える