Hi Alan,

I didn't look in further details yet, but clearly your initWithBlock method is 
wrong, it should be:

- (id)initWithBlock:(void (^)())aBlock;
{
        if ((self = [super init])) {
                block = [aBlock copy];
                NSLog(@"Block: %@", block);
                block();
        }
        return self;
}

You are not assigning `self` to be equal to what `[super init]` returns, and 
this is, even without macruby or blocks, prone to crashes :-)

Can you try to fix this and then tell us if it's still crashing?

-- 
Thibault Martin-Lagardette



On Nov 19, 2010, at 10:14, Alan Skipp wrote:

> I've been attempting to get an objective-c framework to work with macruby and 
> I believe I've found a bug in the way ruby Proc objects are copied when used 
> as objective-c blocks.
> The copied block doesn't seem to persist correctly beyond the scope in which 
> it was copied. It isn't deallocated, but calling it results in a crash. 
> Typical error messages are:
>  wrong type NSCFSet (expected Proc) (TypeError)
>  wrong type NSRectSet (expected Proc) (TypeError)
> I'm guessing that there's a pointer to the wrong memory location?
> 
> Here's the Objective-C implementation:
> 
> @implementation TestBlock
> 
> - (id)initWithBlock:(void (^)())aBlock;
> {
>       [super init];
>       block = [aBlock copy];
>       NSLog(@"Block: %@", block);
>       block();
>       return self;
> }
> 
> - (void)callBlock;
> {
>       NSLog(@"block: %@", block);
>       block();
> }
> 
> @end
> 
> 
> Within 'initWithBlock:', the copied block can be invoked without error. 
> Attempting to do so from 'callBlock', results in a crash. The test framework 
> can be used without error when using objective-c.
> 
> Here's the ruby controller code:
> 
> @b = TestBlock.alloc.initWithBlock Proc.new { puts "hello from ruby"} 
> 
> # this next line is called from a different scope and causes the crash
> @b.callBlock
> 
> 
> 2010-11-19 08:41:06.620 CallObjectiveCBlocks[7046:a0f] Block: 
> <__NSAutoBlock__: 0x200be74a0>
> hello from ruby
> 
> 2010-11-19 08:41:20.011 CallObjectiveCBlocks[7046:a0f] block: 
> <__NSAutoBlock__: 0x200be74a0>
> 2010-11-19 08:41:20.012 CallObjectiveCBlocks[7046:a0f] 
> /Users/alan/Documents/programming/macruby/CallObjectiveCBlocks/build/Debug/CallObjectiveCBlocks.app/Contents/Resources/Controller.rb:21:in
>  `call:': wrong type Array (expected Proc) (TypeError)
>       from 
> /Users/alan/Documents/programming/macruby/CallObjectiveCBlocks/build/Debug/CallObjectiveCBlocks.app/Contents/Resources/rb_main.rb:23:in
>  `<main>'
> _______________________________________________
> 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

Reply via email to