2011-07-26 13 views
3

セレクタalertDidEnd:returnCode:contextInfo:を実装しました。最後のパラメータcontextInfoはvoidポインタです。メソッドを呼び出す前に、次のようにポインタをまとめます。私のMacrubyポインタがvoidポインタとして渡されても生き残れないのはなぜですか?

# in windowShouldClose 
p = Pointer.new(:boolean) 
p.assign(true) 

その後、私はメソッドを呼び出すと、その本体の内側に次き:

# in alertDidEnd 
puts p[0] # => a number like 245 
puts p.cast!('B')[0] # => false (rather than true) 

は私が間違って何をしているのですか?これは、呼び出し元のメソッド(windowShouldClose)がこのセレクタの前に独自のスレッドで終了するためです(ちょうど推測)。

オブジェクトポインタとしてポインタを作成する必要がありますか?

# make a pointer to an object and assign to it the instance of TrueClass 
p = Pointer.new(:id) 
p.assign(true) 

これについては、O'reilly Macruby Bookについてお読みください。

ありがとうございます!

答えて

2

おそらく、このオブジェクトを保持していないためにガベージコレクションが行われない可能性があります。オブジェクトを作成してfinalizeメソッドを実装し、そこにputsを入れると、これが当てはまることがわかります。

シートを作成しているコントローラで状態をトラッキングし、contextInfoとしてコントローラにポインタを渡してみてください。この状態がui要素間の並行対話を仲介している場合、すべての要素を担当するコントローラがそれをとにかく追跡する必要があります。もちろん、コンテキストインフォを渡さずにコールバックを使用してシートを渡して、呼び出された条件を追跡する方が簡単でしょう。

関連する問題