Hi!

I believe the problem is that you were overriding the wrong init method. Here 
is what I changed to your code to make it work:

class MyNode < ODNode
    def initWithSession(session, name:name, error:err)
        if super
            @session = session
            self
        end
    end
end

session = ODSession.defaultSession
node = MyNode.nodeWithSession session, name: "/Local/Default", error: nil

I override initWithSession:name:error instead of init, and created a "MyNode" 
object the exact same way I would have created an ODNode :-)
The results were, I believe, what you would expect:

$> macruby od.rb 
{"dsAttrTypeStandard:AppleMetaNodeLocation"=>["/Local/Default"], ...}

Hope that helps!

-- 
Thibault Martin-Lagardette



On May 4, 2010, at 23:37, russell muetzelfeldt wrote:

> Hi All,
> 
> I've produced an ugly bunch of ruby that talks to OpenDirectory and am trying 
> to clean it up a bit. Currently I'm using pure ruby classes that proxy Obj-C 
> objects held in instance variables, but my goal is to have something 
> structured like this -
> 
> module OpenDirectory
>  class Node < ODNode
>    def find_user_by_name name
>      ...
>    end
>  end
> end
> 
> but I can't work out how to make a Ruby class that subclasses an Obj-C class 
> and overrides the initialiser. With classes that descend from Obj-C classes 
> the ruby "initialize" method doesn't seem to get called (because they're 
> missing descent from the Ruby base Object class?), and all my attempts to 
> override init result in
> 
> 2010-05-05 15:55:34.237 macruby[2600:903] object 0x200249900 with 0 
> retain-count passed to CFMakeCollectable.
> 
> and a segfault.
> 
> Attached below is a reduced case, if anyone can point out how to get a valid 
> MyNode object it'd be much appreciated. If node is a real ODNode (as in the 
> commented lines) all works correctly. I'm not calling super, since the object 
> has (I believe) already been alloc'd and I'm explicitly calling the 
> designated initializer later in my own init. If I *do* call super in my own 
> init, I just get an additional "object 0x... with 0 retain-count passed to 
> CFMakeCollectable" error. If I use ODNode.nodeWithSession:name:error: in my 
> own init the example below works, but I end up with an ODNode rather than a 
> MyNode so it's missing any methods I'm adding to my own class.
> 
> (I'm also unsure whether I need to be retaining the session in an instance 
> variable myself or if it's also being retained in the ODNode, but that's 
> another question.)
> 
> Any pointers very much appreciated...
> 
> Russell
> 
> 
> example:
> 
> 
> framework 'OpenDirectory'
> 
> # no BridgeSupport for CFOpenDirectory.framework... :(
> Users = "dsRecTypeStandard:Users"
> RecordName = "dsAttrTypeStandard:RecordName"
> MatchEqualTo = 0x2001
> RealName = "dsAttrTypeStandard:RealName"
> 
> # some account name to search for
> me = "russm"
> 
> class MyNode < ODNode
>  def init
>    @session = ODSession.defaultSession
>    STDERR.puts "===== pre CFMakeCollectable error"
>    self.initWithSession @session, name:"/Local/Default", error:nil
>    STDERR.puts "===== post CFMakeCollectable error"
>    self
>  end
> end
> 
> node = MyNode.new
> #session = ODSession.defaultSession
> #node = ODNode.nodeWithSession session, name:"/Local/Default", error:nil
> query = ODQuery.queryWithNode node,
>  forRecordTypes: Users,
>  attribute: RecordName,
>  matchType: MatchEqualTo,
>  queryValues: me,
>  returnAttributes: RealName,
>  maximumResults:0,
>  error:nil
> STDERR.puts "===== pre segfault"
> results = query.resultsAllowingPartial false, error:nil
> STDERR.puts "===== post segfault"
> result_attributes = results[0].recordDetailsForAttributes nil, error:nil
> puts result_attributes.inspect
> 
> _______________________________________________
> 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