Hi Jean-Denis 1. Thank you for your advice about awakeFromNib and InitWithCoder. 2. "That is a bonus you ..". This is not a bonus. This is Ruby. If you define a Ruby class you expect that any object will get instantiated through "initialize". I have a feeling that all who responded to me on the forum started their programming track from Objective-C and proceeded to Ruby. I am coming from the opposite direction. I come from Ruby and wants to deal with Objective-C as little as possible. So I expect MacRuby to be as much "Ruby" as it is possible. Many Thanks, David On Dec 10, 2012, at 11:27 AM, Jean-Denis MUYS wrote:
> > On 7 déc. 2012, at 19:48:39, david kramf <dakr....@gmail.com> > wrote: >> >> Message: 1 >> Date: Fri, 7 Dec 2012 19:48:39 +0200 >> From: david kramf <dakr....@gmail.com> >> To: "MacRuby development discussions." >> <macruby-devel@lists.macosforge.org> >> Subject: Re: [MacRuby-devel] Problem with a window controller >> Message-ID: <1f1681c7-9de6-4971-8d17-722f5ec63...@gmail.com> >> Content-Type: text/plain; charset="us-ascii" >> >> Hi Bob, >> "As you become more familiar with IB, you will probably do more >> initialization of objects in IB and less in MacRuby. Nib file expansion >> instantiates objects and then makes calls to initialize the objects using >> the same methods that you are using to initialize objects in MacRuby. >> Actually, in a large application, it would difficult to hook up all of the >> outlets without using IB." >> >> From my modest acquaintance with MacRuby that is not exactly the case since >> when the NIB instantiates an NSWindowController object , it does not call >> "initialize" > > Cocoa, whether accessed from Ruby, Python, Objective-C or any language, uses > the Cocoa initialization patterns. It's unrealistic to assume the framework > patterns to change when you change the client language. > >> ,as defined in Ruby , but calls "awakeFromNib". > > It does, but caveat: awakeFromNib is *not* an initialization method, even > though it is often used as such. I was bitten before. The correct > initialization method to use for Nib files is initWithCoder:. What's the > difference, says you (and me)? Behold: awakeFromNib can be called several > times in the lifetime of an object. This is no big deals for most > initializations, but becomes a major issue in others. In my case, I was > registering for notifications in awakeFromNib. Since I was registered several > times, I got the notifications multiple times, and since I only unsubscribed > once in dealloc, my app would crash. > > Many cases when awakeFromNib is called more than once are programming errors, > but not all. And since there *is* a real initializer, I recommend using it. > > So in that case why is there an awakeFromNib method at all? It is because at > initWithCoder: time, IB outlets are not yet loaded and are all nil. So > awakeFromNib is meant to for initialization code that configures outlet. > > So here is a recipe: > > 1- Does you initialization code requires IB outlets to be alive? If not, > override initWithCoder: > 2- If so, put it in awakeFromNib > 3- Does that awakeFromNib initialization code need to be called once only? if > so, make it conditional on it having been already be called. > 4- Optional: assert that awakeFromNib was not called before, and if that > assert fires, investigate whether the case is legitimate or due to a bug in > your code. > >> Only when you instantiate your controller from the code itself , you get >> your "initialize"method called. > > That is a bonus you just can be happy to have due to the deep integration of > MacRuby in the Objective-C runtime system. There is no reason to assume that > bonus to expand to objects created by the framework. > >> I know I still have a lot of practicing on IB. What I find disturbing ,is >> that when I do something with IB I cannot see the code created to >> accommodate my actions ( maybe because I only work in MacRuby and not >> Objective-C?). > > No. This is simply because there **no code created**. At all. IB does't > generate code. And lest I forget: Interface Builder is not a code generation > tool. IB instantiates and populates objects, and then serializes them to > disk. Those objects are then simply deserialized from disk in your app. At no > point ever is any code generated. Therefore, there is no "code created to > accommodate your actions" for you to see. Even in Objective-C. > > Best regards, > > Jean-Denis > > _______________________________________________ > MacRuby-devel mailing list > MacRuby-devel@lists.macosforge.org > http://lists.macosforge.org/mailman/listinfo/macruby-devel _______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo/macruby-devel