Brian-- Thanks for the great explanation. I'm going to have to rethink how my object achieves a known initial state.
Steve On Jan 21, 2010, at 6:41 PM, Brian Chapados wrote: > > Hi Steve (et al), > > So, there are a couple things going on here. Cocoa classes use the > concept of a "designated initializer" method, which is a name for the > instance method that calls the initializer method of the superclass. > This chain continues until you hit [NSObject#init]. To figure this out > from the documentation: > > - If a class does not document an initializer method, check the > superclass, and continue up the chain until you find it. > - If there are multiple initializer methods, the documentation for > Cocoa classes will always tell you which method is the designated > initializer. > > In ObjC/Cocoa: > If you have a subclass that requires input during initialization, you > should create a new designated initializer. That method should call > the designated initializer of the superclass and you should override > -init to call your new designated initializer. > > All of this stuff is explained pretty well in Apple's Objective-C guide. > > In Matt's example, he creates a few initialization helper methods, but > -init is still the designated initializer. > > In your case, NSTextField is a subclass of NSControl, and the > designated initializer is (from NSControl): > > -initWithFrame:(NSRect)frameRect > > I think your subclass of NSTextField should have an -initWithFrame: > method or another init method that calls super.initWithFrame: > Although, if you're not supposed to call super.init in MacRuby, then > I'm not sure how this is supposed to work. > > Last point: The one odd exception case to the initialization chain is > the one you hit: NIB files! > > nib/xib files are basically freeze-dried collections of objects that > are archived into a file. When they are restored, this is done by > unarchiving the file, which uses the NSCoder methods. Most of the time > if you need to do custom configuration on an object instantiated from > a nib file, you should probably do that in -awakeFromNib. However, if > for some reason you really need to do something during object > initialization, you need to do that in initWithCoder:, since this > method will be called for objects in a nib file. > > Brian > > On Thu, Jan 21, 2010 at 4:33 PM, steve ross <cwdi...@gmail.com> wrote: >> So that confirms my suspicion. It's not so much a MacRuby thing as a Cocoa >> thing. I just don't see how to set an initial state in a class that's >> instantiated when a nib is loaded. I don't do the alloc.initWithWhatever. On >> the previous subject though, adding super/self does not cause the initialize >> method to be called. Hmmmmmm... >> On Jan 21, 2010, at 4:20 PM, Matt Aimonetti wrote: >> >> Overwriting the init method of a Cocoa class subclass is not recommended. >> Here is an example of what I was suggesting: >> >> http://github.com/mattetti/phileas_frog/blob/master/image_layer.rb#L44 >> >> Which then get called >> there: >> http://github.com/mattetti/phileas_frog/blob/master/game_controller.rb#L57 >> >> In any cases, you still need to call init (or super if you overwrite >> initialize) and you need to return self. >> _______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel