Posts Tagged ‘Release’

Releasing NSWindowController properly

Saturday, September 20th, 2008

Yesterday I found that one my application doesn’t release NSWindowController. The problem was that I was not using NSDocument architecture, and releasing NSWindowController is a little different without NSDocument than with NSDocument.

By default, when closing a window with the red button on the top, you will not release the window controller object. If you want to do so, you must implement the windowWillClose notification in your window controller, and autorelease self. Yes, autorelease self, because this will release window controller later after the code that handles the click on the red button handles to the close event, and hides the window. During all this work, the window controller must be ready to react. Later, when your window controller gets disposed, it also automatically decreases retain count in the window, and thus the window object will be released as well. So you should use code such as this in your NSWindowController subclass:

@implementation MyWindowController
-(void) windowWillClose:(NSNotification *)notification
{
   [self autorelease];
}

Also don’t forget that your window cannot have two properties that automatically release some objects. Both must be set to FALSE. The first property releases the document on close of window (your application would crash if set to TRUE - there is not document - hm, Apple might check this as well, and not to crash the application). The second property is that the window itself will be released on close (your application would also crash since the window will release itself, and your controller will do the same later, so the release count will be 0 at the time of the second release). This second property is often set in Interface Builder application. So, consider calling these two functions when creating a new window.

[[myWinController window] setReleasedWhenClosed:FALSE];
[myWinController setShouldCloseDocument:FALSE];