How about adding an instance variable to your window controller subclass which 
keeps a strong reference to itself. Also register as your own delegate, and nil 
the strong reference in your windowWillClose: (or perhaps windowDidClose:)

Effectively you now have your delegate (yourself) retaining the thing to which 
it is a delegate, which isn't unusual. 

On 20-Jun-2011, at 3:35 AM, Marc Respass wrote:

> Hi Brian,
> 
> The technique that I have been using for a long time is to alloc/init the 
> window controller, make the window controller the delegate of the window, and 
> invoke [self autorelease] in windowWillClose:. It's essentially the same 
> thing you are doing with less code.
> 
> The thing that I love about this technique is that my window is now 
> completely independent. If it's a window used as a sheet, I may have many 
> different objects using it. Simply closing the window cleans up everything.
> 
> As others have pointed out, this technique is incompatible with ARC. There 
> are two ways around that. I would like to know what others think about them. 
> One solution is to create a static NSMutableSet in the window controller that 
> holds all instances of that window controller. In -init, you can do 
> [windowControllerSet__ addObject:self]; and in windowWillClose: you invoke 
> [windowControllerSet__ removeObject:self];. Of course windowControllerSet__ 
> is static so it lives for the life of the app.
> 
> Another solution would be that every object that creates an instance of your 
> window controller (though it probably works for any instance of any window 
> controller) also holds an array of those window controllers and it registers 
> to receive the windowWillClose: notification so it can remove it.
> 
> As I say above, I like the independence of the window controller being up to 
> clean up after itself. It's also a lot less code. 
> 
> Hope this helps
> Marc
> 
>> Hello.
>> 
>> I'm building a Cocoa application and have a question about using
>> window controllers. The idea is that when the user selects New from
>> the File menu, an instance of MyWindowController which is a subclass
>> of NSWindowController is created and a new window from MyWindow.xib is
>> displayed.
>> 
>> I'm handling the action in the application delegate. From what I have
>> seen after searching around something like the following could be
>> done. Once the window is displayed I don't have any reason to store a
>> pointer to the window controller anymore and since I allocated it I
>> also have it autoreleased before displaying the window.
>> 
>> [[[[MyWindowController alloc] init] autorelease] showWindow:self];
>> 
>> Since the window is released soon afterwards the window will briefly
>> display on the screen and then go away. I'm using a solution where I
>> retain the window controller in the -showWindow: method and let it
>> release itself once it gets a windowWillClose notification.
>> 
>> - (IBAction)showWindow:(id)sender
>> {
>>    void (^windowWillCloseHandler)(NSNotification *) = ^(NSNotification 
>> *note) {
>>        [[NSNotificationCenter defaultCenter] removeObserver:self
>> name:NSWindowWillCloseNotification object:self.window];
>>        [self release];
>>    };
>> 
>>    [self retain];
>>    [[NSNotificationCenter defaultCenter]
>> addObserverForName:NSWindowWillCloseNotification object:self.window
>> queue:nil usingBlock:windowWillCloseHandler];
>>    [super showWindow:sender];
>> }
>> 
>> Is there a better way to do this? I have searched the documentation
>> and have not found anything specific on which practices to use. It
>> sounds like something very basic which it should cover so maybe I'm
>> just searching with the wrong terms.
> _______________________________________________
> 
> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
> 
> 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:
> http://lists.apple.com/mailman/options/cocoa-dev/rols%40rols.org
> 
> This email sent to r...@rols.org

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to