我是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
我做错了。任何正确方向的指针?
答案 0 :(得分:5)
使用实例变量:
@something = Something.new
@something.getSomething
RubyMotion有一些与局部变量和块相关的错误。您将分配给something
,然后调用something.getSomething
,然后使用BubbleWrap的异步HTTP.post
方法。 BubbleWrap HTTP块运行,但与此同时,您调用something.getSomething
的方法已完成执行。由于something
是一个局部变量,因此在方法退出时会收集垃圾。因此,当HTTP请求完成并调用块时,该块不再存在。
您可能会看到随机不一致的错误(偶尔会出现一次实际的工作请求),因为每次存储块的内存位置都被回收用于其他内容(或者偶尔会回收一次完全回收所以块仍在那里)。当您使用实例变量时,这一切都不会发生,因为当调用方法完成执行时,实例变量会一直存在。
这种行为绝对是出乎意料的;我知道已经提交了一些问题(包括我自己)以解决这个问题。