0

私は RubyMotion を初めて使用し、オブジェクトの初期化がどのように機能するかを理解しようとしています。1 つのクラスと 1 つのインスタンス メソッドを持つ単純なクラスを想定します。

class Something
  def self.getSomething
    BubbleWrap::HTTP.post("http://example.com") do |response|
      p response
    end
  end

  def getSomething
    BubbleWrap::HTTP.post("http://example.com") do |response|
      p response
    end
  end
end

では、なぜ次のように動作するのでしょうか。

Something.getSomething

そして、次のスニペットはそうではありませんでした (このスニペットを実行すると、ランタイムは 10 回中 8 回クラッシュしました)。

something = Something.new
something.getSomething

私はそれを間違っています。正しい方向への指針はありますか?

4

1 に答える 1

5

インスタンス変数を使用します。

@something = Something.new
@something.getSomething

RubyMotion には、ローカル変数とブロックに関連するいくつかのバグがあります。に割り当ててからsomething呼び出すとsomething.getSomething、BubbleWrap の非同期HTTP.postメソッドが使用されます。BubbleWrap HTTP ブロックが実行されますが、その間に呼び出し元のメソッドのsomething.getSomething実行が完了しています。はローカル変数であるためsomething、メソッドの終了時にガベージ コレクションが行われます。したがって、HTTP 要求が完了してブロックが呼び出されると、ブロックは存在しなくなります。

ブロックが保存されていたメモリの場所が毎回別の目的で再利用された (または、まったく再利用されなかった) ため、ランダムな一貫性のないエラー (および、実際に機能するリクエストが時々発生する) が発生する可能性があります。そのため、ブロックはまだそこにあります)。代わりにインスタンス変数を使用すると、呼び出し元のメソッドの実行が終了すると、インスタンス変数が残り続けるため、これは発生しません。

この動作はまったく予想外です。これを修正するために、いくつかの問題が提出されていることを知っています(私自身も含まれています)。

于 2012-10-31T19:45:05.137 に答える