RubyMotion中的对象初始化

Cim*_*imm 0 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
Run Code Online (Sandbox Code Playgroud)

现在,为什么以下工作:

Something.getSomething
Run Code Online (Sandbox Code Playgroud)

并且下一个片段不是,有时候(运行此片段和运行时在10次中崩溃了8次).

something = Something.new
something.getSomething
Run Code Online (Sandbox Code Playgroud)

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

Dyl*_*kow 5

使用实例变量:

@something = Something.new
@something.getSomething
Run Code Online (Sandbox Code Playgroud)

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

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

这种行为绝对是意外的; 我知道已经提交了几个问题(包括我自己)来解决这个问题.