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 ([email protected])
>>
>> 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 [email protected]
>
_______________________________________________
Cocoa-dev mailing list ([email protected])
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 [email protected]