Minor corrections to toolbar to correct a memory leak.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@19684 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
gcasa 2004-07-05 12:57:47 +00:00
parent 55fa450e4a
commit b0adad8c30
3 changed files with 59 additions and 15 deletions

View file

@ -1,3 +1,14 @@
2004-07-05 Gregory John Casamento <greg_casamento@yahoo.com>
* Source/NSToolbar.m: [NSToolbar _setWindow:] added logic
to accept the NSWindowWillCloseNotification, since the toolbar
will need to remove itself from the "toolbars" master array.
Also added a method called [NSToolbar _handleNotification:]
to do the actual removal.
* Source/GSToolbar.m: [GSToolbar _setDelegate:] toolbar
no longer retains it's delegate. This prevents the delegate
from leaking.
2004-07-03 Fred Kiefer <FredKiefer@gmx.de> 2004-07-03 Fred Kiefer <FredKiefer@gmx.de>
* Source/NSOutlineView.m: Moved private methods into separate * Source/NSOutlineView.m: Moved private methods into separate
@ -18,19 +29,22 @@
ivar to the GSNibContainer class and the method to retrieve it. ivar to the GSNibContainer class and the method to retrieve it.
* Source/GSNibTemplates.m: Move the private class GSNibItemCollector * Source/GSNibTemplates.m: Move the private class GSNibItemCollector
from NSBundleAdditions.m to GSNibTemplates.m. This helped clean up from NSBundleAdditions.m to GSNibTemplates.m. This helped clean up
code and also facilitated the changes necessary for the new .gorm version. code and also facilitated the changes necessary for the new .gorm
Also changed the signature of awakeWithContext: so it only takes the context version. Also changed the signature of awakeWithContext: so it
dictionary as an argument and no longer requires the items to be passed in. only takes the context dictionary as an argument and no longer
requires the items to be passed in.
Changed the awakeWithContext method to efficiently retain the objects. Changed the awakeWithContext method to efficiently retain the objects.
In initWithCoder: and encodeWithCoder: added new section for updated In initWithCoder: and encodeWithCoder: added new section for updated
version. Added some logic to collect the top level items at that time version. Added some logic to collect the top level items at that time
so that version 0 and version 1 .gorm files load in a precisely equivalent so that version 0 and version 1 .gorm files load in a precisely
manner. Also, updated a change made by Alex Malmberg which was causing equivalent manner. Also, updated a change made by Alex Malmberg
the designated initializers to not be called. which was causing the designated initializers to not be called.
* Source/NSBundleAdditions.m: Moved class to GSNibTemplates as described * Source/NSBundleAdditions.m: Moved class to GSNibTemplates as
above. Cleaned up implementation of +loadNibNamed:context:. described above. Cleaned up implementation of +loadNibFile:
* Source/NSNib.m: Removed some of the code which was there to collect top level externalNameTable:withZone:.
items. Also cleaned up some of the code with the new implementation. * Source/NSNib.m: Removed some of the code which was there to
collect top level items. Also cleaned up some of the code with
the new implementation.
2004-06-28 Serg Stoyan <stoyan255@ukr.net> 2004-06-28 Serg Stoyan <stoyan255@ukr.net>

View file

@ -1041,6 +1041,8 @@ static id validationCenter;
- (void) _setDelegate: (id)delegate broadcast: (BOOL)broadcast - (void) _setDelegate: (id)delegate broadcast: (BOOL)broadcast
{ {
if(_delegate)
[nc removeObserver: _delegate name: nil object: self];
if (_delegate == delegate if (_delegate == delegate
|| (broadcast == NO && [_delegate isMemberOfClass: [delegate class]])) || (broadcast == NO && [_delegate isMemberOfClass: [delegate class]]))
@ -1063,10 +1065,8 @@ static id validationCenter;
CHECK_REQUIRED_METHOD(toolbarAllowedItemIdentifiers:); CHECK_REQUIRED_METHOD(toolbarAllowedItemIdentifiers:);
CHECK_REQUIRED_METHOD(toolbarDefaultItemIdentifiers:); CHECK_REQUIRED_METHOD(toolbarDefaultItemIdentifiers:);
if (_delegate) // assign the delegate...
[nc removeObserver: _delegate name: nil object: self]; _delegate = delegate;
ASSIGN(_delegate, delegate);
#define SET_DELEGATE_NOTIFICATION(notif_name) \ #define SET_DELEGATE_NOTIFICATION(notif_name) \
if ([_delegate respondsToSelector: @selector(toolbar##notif_name:)]) \ if ([_delegate respondsToSelector: @selector(toolbar##notif_name:)]) \

View file

@ -247,13 +247,43 @@ static const int current_version = 1;
} }
} }
// handle notifications
- (void) handleNotification: (NSNotification *)notification
{
NSMutableArray *toolbars = [GSToolbar _toolbars];
// We currently only worry about when our window closes.
// It's necessary to remove the toolbar which belongs to this
// window from the master list, so that it doesn't cause a
// memory leak.
[toolbars removeObjectIdenticalTo: self];
}
// Private Accessors // Private Accessors
- (void)_setWindow: (NSWindow *)window - (void)_setWindow: (NSWindow *)window
{ {
_window = window; if(_window != window)
{
if(_window)
{
[nc removeObserver: _window];
}
if(window)
{
// watch for this window closing....
[nc addObserver: self
selector: @selector(handleNotification:)
name: NSWindowWillCloseNotification
object: window];
}
}
// We don't do an ASSIGN because the toolbar view retains us. // We don't do an ASSIGN because the toolbar view retains us.
// call [NSWindow(Toolbar) setToolbar:] to set the toolbar window // call [NSWindow(Toolbar) setToolbar:] to set the toolbar window
_window = window;
} }
- (NSWindow *) _window - (NSWindow *) _window