私はSwiftについてもっと学び、defer
ステートメントを最近訪れました。これは本当に興味深いようです。しかし、私はそれが目的であることを本当に理解していません。 C++からは、割り当て解除機能を使用して同じ機能を実装していましたが、SwiftはARCなので、同じことができます。Swiftのリソース割り当て解除のためにdeinitとdeferを使用した場合の違い
はの割り当てを解除する必要があるデータとFooData
とBarData
仕事の両方を言ってみましょう。
class FooData {
deinit {
print("FooData being deallocated")
}
}
class BarData {
}
func baz() -> Int {
var a = FooData()
var b = BarData()
defer { print("BarData being deallocated") }
/* sensitive operations that could throw at any time */
return 0
}
baz()
// BarData being deallocated
// FooData being deallocated
のでdeinit
アプローチを超えるdefer
アプローチの利点は何ですか?リソースのクリーンアップ以外に何かのためにdefer
を使用することについて考えてみると、私の頭が痛くなります。
しかし、この場合、接続オブジェクトの接続の寿命を延ばすことができます。データベースは後で使用するために保管され、接続は終了します。 – hgiesel
はい、できます。 RAIIは確かに有能ですが、これが示すように、他の方法があります。 – Alexander
ここで、閉じられなければならないクラス/構造体があなたのものではないので、あなたは 'deinit'を変更できません。じゃあ何?あなたはラッパーオブジェクトを書く必要があります。面倒です。 – Alexander