Hi Eloy, The way I'm initializing the ruby objects is with a custom class method as they must be intialized with arguments. For example, here is the macruby class method:
def self.initWithPath(path, isActive:active) new(path, active) end Which means that in Objective-C I'm using the somewhat verbose code below: [rubyClass performSelector:@selector(initWithPath:isActive:) withObject:path withObject:[NSNumber numberWithBool:YES]]; If the class could be initialized without arguments then I could use: [[rubyClass alloc] init]; But I've not tried that yet. I imagine it would be a tiny bit faster again, as it doesn't use 'performSelector'. Alan On 17 Jan 2011, at 17:36, Eloy Duran wrote: > You're welcome Alan :) > > Hmm, I wonder if this big impact is because of skipping evaling everytime, > which iirc is the only thing that evaluateString does, or something else is > happening... Have you also tried doing [rubyClass new] instead of alloc init? > I thought they should do the same. > > On 17 jan. 2011, at 15:57, Alan Skipp <al_sk...@fastmail.fm> wrote: > >> Brilliant suggestion Eloy, much appreciated. >> There's a noticeable improvement in speed using this technique. In the >> method which added ruby objects to an array, 77% of the time was spent on >> initialising the objects, that's now down to 35%. >> >> Alan >> >> On 17 Jan 2011, at 13:32, Eloy Durán wrote: >> >>> After the Ruby code that defines the class has been evaled, you should be >>> able to do the following: >>> >>> Class rubyClass = NSClassFromString(@"RubyClass"); >>> id rubyObject = [[rubyClass alloc] init]; >>> >>> On Jan 17, 2011, at 2:05 PM, Alan Skipp wrote: >>> >>>> Hi, >>>> Is there any way to inform an Objective-C class of the existence of a ruby >>>> class so that instances can be created in Objective-C code? >>>> Currently I am doing the following: >>>> >>>> [[MacRuby sharedRuntime] evaluateString:[NSString >>>> stringWithFormat:@"RubyClass.new('%@')", arg]]; >>>> >>>> If I'm adding quite a few objects (300+) to an array in a loop, this line >>>> of code is quite slow. My assumption (which may be false) is that either >>>> of the 3 options below would be quicker. >>>> >>>> [RubyClass performSelector:@selector(new:) withObject:arg]; >>>> [RubyClass new:arg]; >>>> [[RubyClass alloc] initWithArg:arg]; >>>> >>>> Are any of those options (or an equivalent) a possibility? >>>> >>>> Alan >>>> _______________________________________________ >>>> 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 >> >> _______________________________________________ >> 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 _______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel