今日、私defer
は Go 言語のステートメントについて読みました:
deferステートメントは、関数呼び出しをリストにプッシュします。保存された呼び出しのリストは、周囲の関数が戻った後に実行されます。Defer は、さまざまなクリーンアップ アクションを実行する関数を単純化するためによく使用されます。
このようなものを Objective-C で実装するのは楽しいだろうと思いました。それを行う方法について何か考えがありますか?ディスパッチ ファイナライザー、自動解放オブジェクト、および C++ デストラクタについて考えました。
自動解放されたオブジェクト:
@interface Defer : NSObject {}
+ (id) withCode: (dispatch_block_t) block;
@end
@implementation Defer
- (void) dealloc {
block();
[super dealloc];
}
@end
#define defer(__x) [Defer withCode:^{__x}]
- (void) function
{
defer(NSLog(@"Done"));
…
}
現在のスコープが終了すると他のソリューションがトリガーされるため、自動解放されたオブジェクトは、少なくとも関数の最後まで続く唯一のソリューションのようです。一方で、それらは記憶にずっと長くとどまる可能性があり、これは問題を引き起こします.
ブロックはスタック上に存在するため、スタックがアンロールされたときに何かを簡単に実行できるため、ディスパッチ ファイナライザーが最初に考えられました。しかし、ドキュメンテーションをのぞいてみると、単純な「デストラクタ」関数をブロックにアタッチできるようには見えませんよね?
C++ デストラクタもほぼ同じです。デストラクタの実行時に実行されるブロックを含むスタック ベースのオブジェクトを作成します。.m
これには、プレーンファイルを Objective-C++ に変換するという醜い欠点がありますか?
このようなものを本番環境で使用することについてはあまり考えていません。さまざまなソリューションに興味があるだけです。明らかな欠点なしで、機能するものを思いつくことができますか? 範囲ベースのソリューションと機能ベースのソリューションの両方が興味深いでしょう。