RubyMotion中的对象初始化

时间:2012-10-31 14:14:27

标签: constructor initialization rubymotion

我是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次)。

something = Something.new
something.getSomething

我做错了。任何正确方向的指针?

1 个答案:

答案 0 :(得分:5)

使用实例变量:

@something = Something.new
@something.getSomething

RubyMotion有一些与局部变量和块相关的错误。您将分配给something,然后调用something.getSomething,然后使用BubbleWrap的异步HTTP.post方法。 BubbleWrap HTTP块运行,但与此同时,您调用something.getSomething的方法已完成执行。由于something是一个局部变量,因此在方法退出时会收集垃圾。因此,当HTTP请求完成并调用块时,该块不再存在。

您可能会看到随机不一致的错误(偶尔会出现一次实际的工作请求),因为每次存储块的内存位置都被回收用于其他内容(或者偶尔会回收一次完全回收所以块仍在那里)。当您使用实例变量时,这一切都不会发生,因为当调用方法完成执行时,实例变量会一直存在。

这种行为绝对是出乎意料的;我知道已经提交了一些问题(包括我自己)以解决这个问题。