Hi Roland,

I don't follow you. You want to add MyWindowController *strongRefToKeepARCHappy 
and set it to [self retain]? I don't see an advantage to that. I suppose it 
would work but you'd want to give it a name like I did or include a comment for 
why you are retaining an instance of yourself. It doesn't feel very good.

"Also register as your own delegate" A window controller is the delegate of its 
*window*, it doesn't have a delegate. Your window controller is the delegate of 
the window so it receives the window's delegate messages (windowDidClose: does 
not exist).

Marc

El Jun 19, 2011, a las 8:11 PM, Roland King escribió:

> 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