[iOS][SpriteKit] playSoundFileNamedなどリソースのロードの失敗

SpriteKitで効果音を再生する際、

[self runAction:[SKAction playSoundFileNamed:@"test.mp3" waitForCompletion:NO]];

と記述していたが、何度も繰り返し再生する場合や、複数のファイルを連続して再生する場合、ロードされない現象が起こる。これは必ず起こるわけではなく、ある程度、走らせていると発生するので原因特定に非常に時間がかかった。stackoverflowでも報告されており、

http://stackoverflow.com/questions/26683171/skaction-playsoundfilenamed-crashes-when-repeat-sprite-kit

初期化時(シーン初期化)にプレロードしておくことで解決するとのこと。

実は、パーティクル生成、テクスチャーの読み込みでも似た様な現象が起こり、

SKEmitterNode* emitter = [NSKeyedUnarchiver unarchiveObjectWithFile:
[[NSBundle mainBundle] pathForResource:@"particle"
ofType:@"sks"]];

上記のコードで、(相当に)繰り返し生成すると、突然emitterにnullが入り、クラッシュする現象である。これもあらかじめ、init時にプレロードして、[emmiter copy]で使い回しす。安全のためテクスチャーもプレロードしてcopyして使うようにした。これでクラッシュは収まった気がする。

 どうやら、リソースの読み込みは、その都度ではなくinit時にプレロードして、コピーが必要なものはコピーして、使いまわすと良い様だ。2日かかった・・・。なきそう