From 7df12d17e5385a2c110e1eca43969603ef66b833 Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Sat, 11 Aug 2007 12:54:55 -0700 Subject: [PATCH] We previously were leaking all over the place due to improper use of memory management techniques and circular references * English.lproj/Debugger.nib: Setting DebuggerWindowController as the window's delgate * Source/AppDelegate.h: Adding a connections ivar * Source/AppDelegate.m: ([AppDelegate init]): New method to initialize the connections array ([AppDelegate applicationWillTerminate:]): Frees the connections array ([AppDelegate registerConnection:]): New method to register a DebuggerConnection ([AppDelegate unregisterConnection:]): Unregisters a DebuggerConnection * Source/ConnectWindowController.m: ([ConnectWindowController connect:]): We weren't properly release'ing the connection, so now we register it with the delegate and release it in the connect method * Source/DeubggerConnection.h: Added a windowDidClose method so that the window controller can forward the message * Source/DebuggerConnection.m: ([DebuggerConnection windowDidClose]): New method to forward the windowWillClose notification ([DebuggerConnection initWithPort:session:]): We no longer have to register for NSApplicationWillTerminate ([DebuggerConnection applicationWillTerminate:]): Removed ([DebuggerConnection dealloc]): Release _windowController * Source/DebuggerWindowController.m: ([DebuggerWindowController initWithConnection:]): No longer retain the connection as it creates a circular ref ([DebuggerWindowController windowWillClose:]): Use this delegate method to buble the notification to the controller ([DebuggerWindowController dealloc]): Since we don't retain _connection, don't release it * Source/SocketWrapper.m: ([SocketWrapper dealloc]): Remove ourselves as a notification observer so we don't have a nil reference --- English.lproj/Debugger.nib/keyedobjects.nib | Bin 16759 -> 16826 bytes Source/AppDelegate.h | 10 ++++-- Source/AppDelegate.m | 36 ++++++++++++++++++++ Source/ConnectWindowController.m | 5 ++- Source/DebuggerConnection.h | 2 ++ Source/DebuggerConnection.m | 15 ++++---- Source/DebuggerWindowController.m | 12 +++++-- Source/SocketWrapper.m | 1 + 8 files changed, 67 insertions(+), 14 deletions(-) diff --git a/English.lproj/Debugger.nib/keyedobjects.nib b/English.lproj/Debugger.nib/keyedobjects.nib index c3914bb0668c83d8530cc6d28128afbce6335f52..4da3cc61873392b8ec73848edff28a25b4ea58ff 100644 GIT binary patch delta 5866 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 delta 5797 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⁣zF8F@(UGZJ_-SXY_{o;Gzd*plSdqIjwjFgaaQblS= zJ!vAXq=O_#nruwABy-44WM{G~*^TU*B!`lP z{*(Sk0b?K$XcOoi7#bKIC=ZMYj19aQ7#EljNCvpTq`<7elEAXSia_%1z^cHSz}mq2 zKy_eO;KRVdz~_Mrfh&P)fqQ|6K_n;*I)Y3vE7&zSFgPq&92^szAKVh$7Tgis8Qc|o zKe#7&I(RntAfyW!LgtVy22pztH&5#1J2v5}F>G8JZP(Cv+%uK6Ej3Idm;_ zGjuz2H>?f^!u68j2H{5GtZ;U?O}JOMPq=@0V0du2Fq{nY;VI#1;ThpY;SJ$U;p*_# z@b>VY@X_$G@R#AQ!~Y3i4nGV(3O@}$k023qq)wz>Bs0=Dk{xLlX%QJ7;Ukri?U5ak z_aeI@yCZudA4c{^4n__~jz_+UoQ|A{oQ<4|T#MX}B%ef)s3bOu z9g^{m@z>*h;)U^%@zQu%ygWWLzAU~XzB0Z#UKQUF-y8oW{%ibU{89W#{8{`3g;Hr0 zMu{mYC8v~>n$l1@%0QVY3uU96l#B9EKFUu8sW26z>Qb3hb7}&Wq7PXREO;u6rs14L6>K$qewT;?A?WA^7`>EU1UFsfnpL#(3 zMm?sUQqO7O?LpqvIwyK2 zh9rs-BNL^G@reluE-^FlIPo;`oIx4Dh#489U{nmwXc;|YWXz0>aWDkqX1t7_2{K_O z%1}&#NoO*c`boK>+JR?nJPE9+ogte5q(AvVfVEW_4e>#><^ zV>X*@&c4RBVcWAE+0JY(+k@@R_G1UKdF(Lu4YrUS$(FLC*|F?+Hpxy(U2S4Wu3^`* z>)DO$X11E$%5G=hW#40Wv;SiEvLCYlW7_5c6? diff --git a/Source/AppDelegate.h b/Source/AppDelegate.h index 338f8ba..29eafb7 100644 --- a/Source/AppDelegate.h +++ b/Source/AppDelegate.h @@ -15,10 +15,16 @@ */ #import - +#import "DebuggerConnection.h" @interface AppDelegate : NSObject -{} +{ + NSMutableArray *connections; +} + + +- (void)registerConnection: (DebuggerConnection *)cnx; +- (void)unregisterConnection: (DebuggerConnection *)cnx; - (IBAction)showConnectionWindow: (id)sender; diff --git a/Source/AppDelegate.m b/Source/AppDelegate.m index 2be8057..668ab00 100644 --- a/Source/AppDelegate.m +++ b/Source/AppDelegate.m @@ -19,6 +19,26 @@ @implementation AppDelegate +/** + * Initializes + */ +- (id)init +{ + if (self = [super init]) + { + connections = [[NSMutableArray alloc] init]; + } + return self; +} + +/** + * Called when the application is going to go away + */ +- (void)applicationWillTerminate: (NSNotification *)aNotification +{ + [connections release]; +} + /** * When the application has finished loading, show the connection dialog */ @@ -27,6 +47,22 @@ [self showConnectionWindow: self]; } +/** + * Adds an object to the connections array + */ +- (void)registerConnection: (DebuggerConnection *)cnx +{ + [connections addObject: cnx]; +} + +/** + * Removes a given connection from the connections array + */ +- (void)unregisterConnection: (DebuggerConnection *)cnx +{ + [connections removeObject: cnx]; +} + /** * Shows the connection window */ diff --git a/Source/ConnectWindowController.m b/Source/ConnectWindowController.m index dfa93c4..872b398 100644 --- a/Source/ConnectWindowController.m +++ b/Source/ConnectWindowController.m @@ -16,6 +16,7 @@ #import "ConnectWindowController.h" #import "DebuggerConnection.h" +#import "AppDelegate.h" @implementation ConnectWindowController @@ -52,7 +53,9 @@ */ - (IBAction)connect: (id)sender { - [[DebuggerConnection alloc] initWithPort: [_port intValue] session: [_session stringValue]]; + DebuggerConnection *cnx = [[DebuggerConnection alloc] initWithPort: [_port intValue] session: [_session stringValue]]; + [[NSApp delegate] registerConnection: cnx]; + [cnx release]; [[self window] orderOut: self]; } diff --git a/Source/DebuggerConnection.h b/Source/DebuggerConnection.h index 7d848ef..1a31084 100644 --- a/Source/DebuggerConnection.h +++ b/Source/DebuggerConnection.h @@ -34,6 +34,8 @@ // initializer - (id)initWithPort: (int)port session: (NSString *)session; +- (void)windowDidClose; + // getter - (int)port; - (NSString *)session; diff --git a/Source/DebuggerConnection.m b/Source/DebuggerConnection.m index a8cd955..b6d5f4d 100644 --- a/Source/DebuggerConnection.m +++ b/Source/DebuggerConnection.m @@ -15,6 +15,7 @@ */ #import "DebuggerConnection.h" +#import "AppDelegate.h" @interface DebuggerConnection (Private) @@ -44,22 +45,17 @@ [_socket setDelegate: self]; [_windowController setStatus: @"Connecting"]; [_socket connect]; - - // clean up after ourselves - [[NSNotificationCenter defaultCenter] addObserver: self - selector: @selector(applicationWillTerminate:) - name: NSApplicationWillTerminateNotification - object: NSApp]; } return self; } /** - * Release ourselves when we're about to die + * This is a forwarded message from DebuggerWindowController that tells the connection to prepare to + * close */ -- (void)applicationWillTerminate: (NSNotification *)notif +- (void)windowDidClose { - [self release]; + [[NSApp delegate] unregisterConnection: self]; } /** @@ -69,6 +65,7 @@ { [_session release]; [_socket release]; + [_windowController release]; [super dealloc]; } diff --git a/Source/DebuggerWindowController.m b/Source/DebuggerWindowController.m index f0483e4..08a9529 100644 --- a/Source/DebuggerWindowController.m +++ b/Source/DebuggerWindowController.m @@ -17,6 +17,7 @@ #import "DebuggerWindowController.h" #import "DebuggerConnection.h" #import "NSXMLElementAdditions.h" +#import "AppDelegate.h" @interface DebuggerWindowController (Private) @@ -33,7 +34,7 @@ { if (self = [super initWithWindowNibName: @"Debugger"]) { - _connection = [cnx retain]; + _connection = cnx; _expandedRegisters = [[NSMutableArray alloc] init]; } return self; @@ -53,12 +54,19 @@ [_sourceViewerScroller display]; } +/** + * Called when the window is going to be closed so we can clean up all of our stuff + */ +- (void)windowWillClose: (NSNotification *)aNotification +{ + [_connection windowDidClose]; +} + /** * Release object members */ - (void)dealloc { - [_connection release]; [_expandedRegisters release]; [super dealloc]; diff --git a/Source/SocketWrapper.m b/Source/SocketWrapper.m index 91c8b32..80dc779 100644 --- a/Source/SocketWrapper.m +++ b/Source/SocketWrapper.m @@ -60,6 +60,7 @@ NSString *NsockDataSent = @"SocketWrapper_DataSent"; */ - (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver: self]; close(_socket); [super dealloc]; -- 2.22.5