为什么我的Macruby指针不能作为void指针传递?

时间:2011-07-26 00:53:36

标签: cocoa pointers macruby

我已经实现了选择器alertDidEnd:returnCode:contextInfo:。最后一个参数contextInfo是一个void指针。在调用方法之前,我将指针放在一起,如下所示。

# in windowShouldClose
p = Pointer.new(:boolean)
p.assign(true)

然后我调用该方法,并在其体内有以下内容:

# in alertDidEnd
puts p[0] # => a number like 245
puts p.cast!('B')[0] # => false (rather than true)

我做错了什么?这是因为调用方法(windowShouldClose)在这个选择器有机会(只是猜测)之前在自己的线程中完成了吗?

或者我应该将指针创建为对象指针吗?

# make a pointer to an object and assign to it the instance of TrueClass
p = Pointer.new(:id)
p.assign(true)

我已经阅读了O'reilly Macruby Book对此有何看法。

谢谢!

1 个答案:

答案 0 :(得分:2)

最可能的原因是没有任何东西保留这个对象,所以它被垃圾收集。如果您创建一个对象并实现其finalize方法并在其中放置一个put,您将能够看到这种情况。

尝试在创建工作表的控制器中跟踪您的状态,并将指针作为contextInfo传递给控制器​​。如果此状态调解ui元素之间的并发交互,那么负责所有元素的控制器可能无论如何都需要跟踪它。当然,可能更容易不传递contextInfo并使用哪个回调给表单跟踪它所调用的条件。