28048


例えばSpriteKitを使って、画面タッチするごとに新しいSKNode(SKPhysicsBodyでaffectedByGravity =
true)が、画面上にポコポコ発生しては下に落っこちていくアプリを作っています。

この場合、画面から消えたように見えても、実際にはバーチャル空間上では存在しており、ずっとy座標を下に落ち続けているSKNodeオブジェクトがメモリ上には存在しているかと思います。

ARCは、参照されなくなったインスタンスを自動で破棄してくれると読みましたが、上記のようなケースではARCは勝手に介在してはくれないのでしょうか？

（現在は取り急ぎの対処法として、SKSceneDelegateのupdateを使い、各SKNodeインスタンスのposition.yの値が0以下になったら、removeFromParentするようにしています）


CC BY-SA 3.0
2016-08-03T10:17:17.840
28046
2016-08-03T10:38:08.077
17376
question
swift arc
SwiftのARCについて教えて下さい（インスタンスがいつ削除されるのか）


ARCのインスタンス管理は極めて単純で、インスタンスが解放(削除と言っても良いと思いますが、ここでは私の慣れ親しんだ言い方で…)されるのは、「そのインスタンスのリファレンスカウントが0になった時」と言えます。

Swiftの場合、(Objective-
CでもARCを使った場合はほぼ同じですが)リファレンスカウントを直接操作することはできない(*1)ので、上の条件は「そのインスタンスがどこからも参照されなくなった時」と言い換えることができます。

*1 無理にやろうと思えば方法はありますが…。

あなたの例で言うと`SKNode`は、`SKScene`を頂点とする木構造の中でしっかり親Nodeに参照されていますから、画面からは見えなくなっても勝手に解放されることはありませんし、実際やってみると分かりますが、親Node(あるいはご先祖の`SKScene`)から子要素をたどっていくと、そのNodeのインスタンスにたどり着くことができます。

「参照されなくなったインスタンスを自動で破棄」と言う場合の「参照」は、画面に見える見えないに関わらず、まだ解放されていない全てのインスタンスからの参照を含んでいます。「上記のようなケースではARCは勝手に介在してはくれないのでしょうか？」については、当然「介在してはくれない」が正解です。なんせ参照カウントは変化しませんから。

_SKSceneDelegateのupdateを使い、各SKNodeインスタンスのposition.yの値が0以下になったら、removeFromParentするようにしています_

「取り急ぎ」と書かれておられますが、それが正しい対応であると思ってください。


CC BY-SA 3.0
2016-08-03T10:38:08.077
28048
2016-08-03T10:38:08.077
13972
28046
answer