NSManagedObject being returned in delegate as Pointer
In this code sample: http://gist.github.com/41855 I am getting a Pointer instance instead of an NSManagedObject_Recipe instance (from Core Data). Subsequently the setValue:forKey: call at the end of the delegate/callback method fails. The top method addImage(sender) launches an NSOpenPanel, which delegates to the second/last method addImageSheetDidEnd:returnCode:contextInfo: when the panel is closed. But instead of passing through the NSManagedObject_Recipe instance to the contextInfo: recipe value, I am getting a Pointer. Is this correct? Or how do I get my NSManagedObject_Recipe instance from the Pointer. MacRuby src for Pointer class doesn't suggest it has any methods for getting the pointed-to thing. rb_cPointer = rb_define_class("Pointer", rb_cObject); rb_undef_alloc_func(rb_cPointer); rb_define_singleton_method(rb_cPointer, "new_with_type", rb_pointer_new_with_type, 1); rb_define_method(rb_cPointer, "assign", rb_pointer_assign, 1); rb_define_method(rb_cPointer, "[]", rb_pointer_aref, 1); Cheers Nic -- Dr Nic Williams iPhone and Rails consultants - http://mocra.com Fun with iPhone/Ruby/Rails/Javascript - http://drnicwilliams.com * Surf Report for iPhone - http://mocra.com/projects/surfreport/ *
On Dec 30, 2008, at 7:32 PM, Nic Williams wrote:
In this code sample: http://gist.github.com/41855 I am getting a Pointer instance instead of an NSManagedObject_Recipe instance (from Core Data). Subsequently the setValue:forKey: call at the end of the delegate/callback method fails.
The top method addImage(sender) launches an NSOpenPanel, which delegates to the second/last method addImageSheetDidEnd:returnCode:contextInfo: when the panel is closed.
But instead of passing through the NSManagedObject_Recipe instance to the contextInfo: recipe value, I am getting a Pointer.
Is this correct? Or how do I get my NSManagedObject_Recipe instance from the Pointer. MacRuby src for Pointer class doesn't suggest it has any methods for getting the pointed-to thing.
rb_cPointer = rb_define_class("Pointer", rb_cObject); rb_undef_alloc_func(rb_cPointer); rb_define_singleton_method(rb_cPointer, "new_with_type", rb_pointer_new_with_type, 1); rb_define_method(rb_cPointer, "assign", rb_pointer_assign, 1); rb_define_method(rb_cPointer, "[]", rb_pointer_aref, 1);
You can do pointer[0] to dereference it. A Pointer object can be created from a C array of elements, which is why Pointer responds to #[] (so that you can dereference a particular slot). Laurent
Calling recipe[0] results in this error: AppDelegate.rb:157:in `[]': can't convert C/Objective-C value `0x8004676a0' of type `v' to Ruby object (ArgumentError) I'm not sure what this means. I've played around with the Pointer class and I can get this error a lot. The original ObjC signature that is called to open the NSOpenPanel is: - (void)beginSheetForDirectory:(NSString *)path file:(NSString *)name modalForWindow:(NSWindow *)docWindow modalDelegate:(id)modalDelegate didEndSelector:(SEL)didEndSelector contextInfo:(void *)contextInfo Where the recipe (NSManagedObject_Recipe) is passed into a (void *)contextInfo. Do I need to do anything fancy for this? Is the (void *) causing the Pointer creation? On Wed, Dec 31, 2008 at 1:46 PM, Laurent Sansonetti <lsansonetti@apple.com> wrote:
On Dec 30, 2008, at 7:32 PM, Nic Williams wrote:
In this code sample: http://gist.github.com/41855 I am getting a Pointer instance instead of an NSManagedObject_Recipe instance (from Core Data). Subsequently the setValue:forKey: call at the end of the delegate/callback method fails.
The top method addImage(sender) launches an NSOpenPanel, which delegates to the second/last method addImageSheetDidEnd:returnCode:contextInfo: when the panel is closed.
But instead of passing through the NSManagedObject_Recipe instance to the contextInfo: recipe value, I am getting a Pointer.
Is this correct? Or how do I get my NSManagedObject_Recipe instance from the Pointer. MacRuby src for Pointer class doesn't suggest it has any methods for getting the pointed-to thing.
rb_cPointer = rb_define_class("Pointer", rb_cObject); rb_undef_alloc_func(rb_cPointer); rb_define_singleton_method(rb_cPointer, "new_with_type", rb_pointer_new_with_type, 1); rb_define_method(rb_cPointer, "assign", rb_pointer_assign, 1); rb_define_method(rb_cPointer, "[]", rb_pointer_aref, 1);
You can do pointer[0] to dereference it.
A Pointer object can be created from a C array of elements, which is why Pointer responds to #[] (so that you can dereference a particular slot).
Laurent _______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
-- Dr Nic Williams iPhone and Rails consultants - http://mocra.com Fun with iPhone/Ruby/Rails/Javascript - http://drnicwilliams.com * Surf Report for iPhone - http://mocra.com/projects/surfreport/ *
Oh I see, indeed. The problem here is that the contextInfo argument has a "void *" type, so the runtime does not know that you passed an Objective-C object for it via an implicit cast. In this case, we need to introduce a new method on Pointer to allow you to change its type. In RubyCocoa, the method is #cast_as, I will probably use the same name. In practice, you should avoid passing objects as context to methods like this one, because their implementation won't keep a GC reference to them, so they might disappear during a collection cycle. Laurent On Dec 30, 2008, at 7:52 PM, Nic Williams wrote:
Calling recipe[0] results in this error:
AppDelegate.rb:157:in `[]': can't convert C/Objective-C value `0x8004676a0' of type `v' to Ruby object (ArgumentError)
I'm not sure what this means. I've played around with the Pointer class and I can get this error a lot.
The original ObjC signature that is called to open the NSOpenPanel is:
- (void)beginSheetForDirectory:(NSString *)path file:(NSString *)name modalForWindow:(NSWindow *)docWindow modalDelegate:(id)modalDelegate didEndSelector:(SEL)didEndSelector contextInfo:(void *)contextInfo
Where the recipe (NSManagedObject_Recipe) is passed into a (void *)contextInfo. Do I need to do anything fancy for this? Is the (void *) causing the Pointer creation?
On Wed, Dec 31, 2008 at 1:46 PM, Laurent Sansonetti <lsansonetti@apple.com> wrote:
On Dec 30, 2008, at 7:32 PM, Nic Williams wrote:
In this code sample: http://gist.github.com/41855 I am getting a Pointer instance instead of an NSManagedObject_Recipe instance (from Core Data). Subsequently the setValue:forKey: call at the end of the delegate/callback method fails.
The top method addImage(sender) launches an NSOpenPanel, which delegates to the second/last method addImageSheetDidEnd:returnCode:contextInfo: when the panel is closed.
But instead of passing through the NSManagedObject_Recipe instance to the contextInfo: recipe value, I am getting a Pointer.
Is this correct? Or how do I get my NSManagedObject_Recipe instance from the Pointer. MacRuby src for Pointer class doesn't suggest it has any methods for getting the pointed-to thing.
rb_cPointer = rb_define_class("Pointer", rb_cObject); rb_undef_alloc_func(rb_cPointer); rb_define_singleton_method(rb_cPointer, "new_with_type", rb_pointer_new_with_type, 1); rb_define_method(rb_cPointer, "assign", rb_pointer_assign, 1); rb_define_method(rb_cPointer, "[]", rb_pointer_aref, 1);
You can do pointer[0] to dereference it.
A Pointer object can be created from a C array of elements, which is why Pointer responds to #[] (so that you can dereference a particular slot).
Laurent _______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
-- Dr Nic Williams iPhone and Rails consultants - http://mocra.com Fun with iPhone/Ruby/Rails/Javascript - http://drnicwilliams.com * Surf Report for iPhone - http://mocra.com/projects/surfreport/ * _______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
At least I know to look out for (void *) and pass objects around outside them. Thx for the help. On Wed, Dec 31, 2008 at 2:08 PM, Laurent Sansonetti <lsansonetti@apple.com> wrote:
Oh I see, indeed. The problem here is that the contextInfo argument has a "void *" type, so the runtime does not know that you passed an Objective-C object for it via an implicit cast.
In this case, we need to introduce a new method on Pointer to allow you to change its type. In RubyCocoa, the method is #cast_as, I will probably use the same name.
In practice, you should avoid passing objects as context to methods like this one, because their implementation won't keep a GC reference to them, so they might disappear during a collection cycle.
Laurent
On Dec 30, 2008, at 7:52 PM, Nic Williams wrote:
Calling recipe[0] results in this error:
AppDelegate.rb:157:in `[]': can't convert C/Objective-C value `0x8004676a0' of type `v' to Ruby object (ArgumentError)
I'm not sure what this means. I've played around with the Pointer class and I can get this error a lot.
The original ObjC signature that is called to open the NSOpenPanel is:
- (void)beginSheetForDirectory:(NSString *)path file:(NSString *)name modalForWindow:(NSWindow *)docWindow modalDelegate:(id)modalDelegate didEndSelector:(SEL)didEndSelector contextInfo:(void *)contextInfo
Where the recipe (NSManagedObject_Recipe) is passed into a (void *)contextInfo. Do I need to do anything fancy for this? Is the (void *) causing the Pointer creation?
On Wed, Dec 31, 2008 at 1:46 PM, Laurent Sansonetti <lsansonetti@apple.com> wrote:
On Dec 30, 2008, at 7:32 PM, Nic Williams wrote:
In this code sample: http://gist.github.com/41855 I am getting a Pointer instance instead of an NSManagedObject_Recipe instance (from Core Data). Subsequently the setValue:forKey: call at the end of the delegate/callback method fails.
The top method addImage(sender) launches an NSOpenPanel, which delegates to the second/last method addImageSheetDidEnd:returnCode:contextInfo: when the panel is closed.
But instead of passing through the NSManagedObject_Recipe instance to the contextInfo: recipe value, I am getting a Pointer.
Is this correct? Or how do I get my NSManagedObject_Recipe instance from the Pointer. MacRuby src for Pointer class doesn't suggest it has any methods for getting the pointed-to thing.
rb_cPointer = rb_define_class("Pointer", rb_cObject); rb_undef_alloc_func(rb_cPointer); rb_define_singleton_method(rb_cPointer, "new_with_type", rb_pointer_new_with_type, 1); rb_define_method(rb_cPointer, "assign", rb_pointer_assign, 1); rb_define_method(rb_cPointer, "[]", rb_pointer_aref, 1);
You can do pointer[0] to dereference it.
A Pointer object can be created from a C array of elements, which is why Pointer responds to #[] (so that you can dereference a particular slot).
Laurent _______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
-- Dr Nic Williams iPhone and Rails consultants - http://mocra.com Fun with iPhone/Ruby/Rails/Javascript - http://drnicwilliams.com * Surf Report for iPhone - http://mocra.com/projects/surfreport/ * _______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
_______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
-- Dr Nic Williams iPhone and Rails consultants - http://mocra.com Fun with iPhone/Ruby/Rails/Javascript - http://drnicwilliams.com * Surf Report for iPhone - http://mocra.com/projects/surfreport/ *
In practice, you should avoid passing objects as context to methods like this one, because their implementation won't keep a GC reference to them, so they might disappear during a collection cycle.
Since the Cocoa frameworks are GC-aware, these are generally strong pointers. -Ben
participants (4)
-
Benjamin Stiglitz
-
Dr Nic Williams
-
Laurent Sansonetti
-
Nic Williams