3

セレクターを実装しましたalertDidEnd:returnCode:contextInfo:。最後のパラメータ contextInfo は 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がこれについて述べていることを読みました。

ありがとう!

4

1 に答える 1

2

最も可能性の高い理由は、このオブジェクトを保持しているものがないため、ガベージ コレクションが行われることです。オブジェクトを作成してその finalize メソッドを実装し、そこに puts を配置すると、これが事実であることがわかります。

シートを作成しているコントローラーで状態を追跡し、ポインターをコントローラーに contextInfo として渡してみてください。この状態が ui 要素間の同時対話を仲介している場合、すべての要素を担当するコントローラーがそれを追跡する必要がある可能性があります。もちろん、contextInfo を渡さずに、どのコールバックをシートに与えるかを使用して、シートが呼び出された条件を追跡する方がおそらく簡単です。

于 2011-07-26T23:08:01.060 に答える