マルチメディアタイマ・改訂版スマートフォン専用ページを表示ぬるり。クラスにおける細かいこと。>>2006年04月02日マルチメディアタイマ・改訂版さて、前回アップしたマルチメディアタイマですが、速攻で問題点を見つけました。このままでは実行中に参照が無くなったとき、タイマが実行中でも止まってしまいます。タイマが有効な間は参照が無くなってもタイマを止めるまでは動き続けるようにデザインされています。回収されます(当然タイマは強制中断)。タイマが実行中に止まる確認。呼んでも回収されていません。何か前提が間違っていたか、参照が無くなろうが全く止まる気配もありません。呼び出しをしなくても回収されません。そのものが現状、回収され得なくなっています。フィールドにありました。フィールドにそのハンドルを格納しています。いいことですが、静的メンバの対義語にインスタンスメンバを持ってくるのがすごく気持ち悪いです。クラスメンバではなく静的メンバの方が一般的に感じますし。ドキュメントでも静的メンバ<>インスタンスメンバという対になってるんですよね。静的の反対は普通動的ですが、この場面では動的は意味が違いますしねー。非静的メンバというのも据わりが悪いです。いい日本語はないものか。対象外となるようなのですね。回収されてしまっては話になりません。ん〜、理屈的に分からなくもない挙動ですが変な感じです。難儀なことにというべきか幸いなことにと言うべきか、アプリケーション終了時にはファイナライザが呼び出されます。いう仕組みなんでしょ。これでどんな問題が発生するか。した場合は問題ありません。問題はファイナライザに解放を任せた場合です。対象にならない以上、参照が無くなっても居座り続けます。長く居座り続けるのはあまり都合のいい話ではありません、また参照を残していないって事はなんかのイベントで使い捨てに使うことも多いでしょうから、次第にメモリを食いつぶしていくことになります。持ってるって事はこれアンマネージドリソースも持ってる可能性が。実現できるので、あとは適切な保護期間の設定が問題と言うことになります。デリゲートを保護するのを禁止しなければならないと言うことですね。当初とはまるで逆の目的になりましたが。これはまずいと言うことになります。よってメソッドのポインタを移動させられアンマネージドのコンテキストが実行すべきメソッドを見失う、という事態を避けるためでした。確保しておくと言うことになります。なるとほかにも影響が出てきます。されたかどうかを判断していたので。代わりにどうしましょうか。なんかが具合良さそうです。フィールドを、破棄済みの場合は負数にすると言う手もあります、がこれはさすがに分かりづらいでしょう。