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