[MacRuby-devel] Void pointers and userData

Laurent Sansonetti lsansonetti at apple.com
Mon May 4 15:59:04 PDT 2009


Hi Kevin,

On May 2, 2009, at 6:42 AM, Kevin McGuinness wrote:

> Hi,
>
> I'm wondering if it is possible to use the userData field of NSEvent  
> in
> MacRuby. I want to add tracking rectangles to a NSView subclass, and  
> store
> the object that is mouse has entered in the userData field.  
> Something along
> the lines of:
>
>   addTrackingRect(rect, owner:self, userData:obj, assumeInside:false)
>
>   ...
>
>   def mouseEntered(event)
>      obj = event.userData[0]
>   end
>
> However this produces the runtime error:
>
>   can't convert C/Objective-C value `0x800418240' of type `ƿ_\377'  
> to Ruby
>   object (ArgumentError)
>
> Is it possible to set the NSEvent userData field at all in MacRuby?  
> I can
> work around if not, but the userData field would be more efficient.
>
> Thanks,
> Kevin.

This is a recurrent question on the list, and I unfortunately don't  
think it may work. You could allocate a Pointer object, set it to your  
object, and pass it to the  
addTrackingRect:owner:userData:assumeInside: method (making sure both  
the pointer and the object inside the pointer are retained, otherwise  
the GC might collect it), then later, call userData and retrieve the  
object inside the pointer. The problem is that userData returns ^v and  
there is currently no way to "cast" a Pointer object. I will add this  
later (RubyCocoa does it IIRC).

I would recommend an alternative solution, because dealing with this  
can be cumbersome (and cause GC crashes if you're not careful).

Laurent


More information about the MacRuby-devel mailing list