きりかノート 3冊め

おあそびプログラミング

NSApplication を使うコードを簡単に #2

あー、こないだのだと NSApplication#terminate: でプロセスが終了しちゃうのか。ブロックの返り値を持たせてるところを検証しようとしたら、そこまで実行されないことに気づいた。stop: でも runloop が完全に止まるわけでもないしなあ。

うーん、どうするのがいいんだろ?

  • あきらめる(ブロックの実行後、必ず終了する)
  • すごいがんばる

前者かなあ。

名前空間delegate のクラスがわざわざ作成されるのが気持ち悪いような気もするので、無名クラスを使うように変えてみた。

 require 'osx/cocoa'

module OSX

def NSApplication.run_with_temp_app(&proc)
# create delegate of NSApplication
delegate = Class.new(OSX::NSObject).alloc.init
def delegate.applicationDidFinishLaunching(sender)
begin
@proc.call
ensure
OSX::NSApplication.sharedApplication.terminate(self)
end
end
def delegate.proc=(block)
@proc = block
end
delegate.proc = proc
# run new app
app = NSApplication.sharedApplication
app.setDelegate(delegate)
app.run
end

end

ホントは NSObject のインスタンスの特異メソッドにしたかったのだけど、RubyCocoa では、ruby で定義したメソッドが呼ばれるのは、ruby で定義したクラスだけなので。