0

我是 RubyMotion 的新手,并试图了解对象初始化的工作原理。假设一个简单的类有一个类和一个实例方法:

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 回答