• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Window 'close' action fails
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Window 'close' action fails


  • Subject: Re: Window 'close' action fails
  • From: Chris Hanson <email@hidden>
  • Date: Sat, 16 Aug 2008 17:32:36 -0700

On Aug 15, 2008, at 3:28 PM, dct wrote:

I don't believe that my 'close' problem is explained by an awkward init -- as I said before, all of the other U/I operations of the nib "SPlotWindow.nib" are working as expected (so somehow I've dodged a potential bullet, at least so far).

Indeed; your application may be behaving the way you'd like it to for the time being, but it's not doing so for the reasons you expect. That's something you'll need to fix to keep your application maintainable.


I do wonder why it is improper to:
1. load a nib, then
2. init a WindowController instance using that nib, and then
3. init an NSView instance defined as part of the nib using the nib defined frame
all within a subclass init method.

It's improper because you're doing the same thing multiple times, and re-initializing objects that are already initialized. Here's what your original code looked like, with its lines numbered:


    1  - init
    2  {
    3      [NSBundle loadNibNamed:@"SPlotWindow.nib" owner:self];
    4      [super initWithWindowNibName:@"SPlotWindow.nib"];
    5      [splotView initWithFrame:[splotView frame]];
    6      return self;
    7  }

The problems with this are:

(1) You're not assigning to "self" when invoking your superclass designated initializer. That may return a different object; you must return the object you got back from your superclass designated initializer except in very special cases.

(2) On line 3, you're loading a nib file -- and setting its owner to a not-yet-initialized object! -- and then on line 4 you're basically telling your superclass to load that nib again. Line 3 is entirely redundant. Get rid of it.

(3) On line 5, you're not initializing "splotView" with information from the nib. You're **re-initializing** "splotView" with **its own** frame. This will have undefined results, because either your nib won't be loaded yet (once you get rid of line 3) or because initializing the same object twice could put it into a bad state. Furthermore, the frame of "splotView" will be set to whatever it is in the nib automatically, since you've said "splotView" comes from the nib.

In summary, your -init method should really look like Charles Steinman said it should:

    1  - (id)init
    2  {
    3      return [super initWithWindowNibName:@"SPlotWindow.nib"];
    4  }

There's no need to assign to "self" here because you're not doing anything with it, but if you were you should follow the standard Cocoa "self = ...; if (self != nil) { ... } return self;" pattern.

  -- Chris

_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden


References: 
 >Re: Window 'close' action fails (From: Charles Steinman <email@hidden>)
 >Re: Window 'close' action fails (From: dct <email@hidden>)

  • Prev by Date: Re: Preferred Wrapper for TCP Sockets Over Local Network?
  • Next by Date: Re: Window 'close' action fails
  • Previous by thread: Re: Window 'close' action fails
  • Next by thread: arch: posix_spawnp: /Developer/Tools/otest: Bad CPU type in executable
  • Index(es):
    • Date
    • Thread