これが私が見つけたものです:
- クラス メソッド [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 コントラクトを破ります。