« AN Movie Saverのバグ | トップページ | AN Movie Saver 2.0.1 »

2006/12/10

Mac OS Xでスクリーンセーバーを作るときの覚え書き

AN Movie Saverを古いマシンで動かしたら、ちょっと挙動が違うようなので、スクリーンセーバーの挙動をメモっておく。なお、通常のスクリーンセーバーと、システム環境設定でのプレビューでも違うようだ。

Mac OS Xでスクリーンセーバーモジュールを作るときは、ScreenSaverViewクラスを継承するが、このクラスには、OSから呼び出される重要なメソッドとして、
・initWithFrame:
・startAnimation
・stopAnimation
・drawRect:
・dealloc
がある。

(1)通常のスクリーンセーバーの場合、
1.initWithFrame:
2.drawRect:
3.startAnimation
・スクリーンセーバーの実行本体
4.stopAnimation
5.dealloc
の順に呼ばれる。
ただし、startAnimationメソッドをオーバーライドしたときにスーパークラスのstartAnimationを呼び出さなかった場合は、stopAnimation も呼び出されない。

(2)システム環境設定のプレビュー画面では、(OS 10.4.8, CPU1.8GHz)
1.initWithFrame:
2.startAnimation
3.drawRect:
・スクリーンセーバーの実行本体
となり、オプションボタンを押すと
4.hasConfigureSheet
5.stopAnimation
6.configureSheet
・設定を行ってOKボタンを押す
7.closeSheet:
8.startAnimation
9.draw:
スクリーンセーバーの実行本体
となる。
また、他のスクリーンセーバーモジュールを選択すると、
4.stopAnimation
5.dealloc
が呼び出される。
そして、他のシステム環境設定を選択すると
4.stopAnimation
が呼び出されるがdeallocは呼び出されず、再びスクリーンセーバー環境設定を選択すると、initWithFrame:が呼ばれることなく
5.startAnimation
6.draw:
が呼ばれる。
システム環境設定を終了すると、
4.stopAnimation
5.dealloc
が呼ばれる。

古いマシン(OS 10.3.9、CPU400MHz)で実行すると、他のシステム環境設定を選択したときに、
4.stopAnimation
5.dealloc
が呼ばれ、再びスクリーンセーバー環境設定を選択すると、
6.initWithFrame:
7.startAnimation
8.draw:
が呼ばれる。また、closeSheet:メソッドの実行中にstartAnimationとdrawが呼ばれる(これは、AN Movie SaverがcloseSheet:処理中に初期設定を保存するため、時間がかかっているからだと思われる)。

というわけで、スクリーンセーバーは、普通に実行したとき、プレビューの時(OSの種類、CPU速度など)に応じて挙動が変わる可能性があるので気をつける必要がある。
また、上記呼び出し順序等は私が調べた範囲での話なので、呼び出し順序に依存するスクリーンセーバーを書くときは十分注意すること。

|

« AN Movie Saverのバグ | トップページ | AN Movie Saver 2.0.1 »

AN Movie Saver」カテゴリの記事

パソコン・インターネット」カテゴリの記事

コメント

Naoさん、ご苦労様です。

様々な条件で、これほど変わってしまうとは・・・

投稿: 浅黄あぎと | 2006/12/10 22:46

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/3290/13011771

この記事へのトラックバック一覧です: Mac OS Xでスクリーンセーバーを作るときの覚え書き:

« AN Movie Saverのバグ | トップページ | AN Movie Saver 2.0.1 »