From 0f969b6ced7e9ebcbe4bc4e17867ff32d67f27bb Mon Sep 17 00:00:00 2001 From: Alex Merry Date: Mon, 25 Mar 2013 18:15:11 +0000 Subject: Catch some memory leaks Memory usage on Linux no longer shoots up after running the tikz parser a handful of times. --- tikzit/src/common/Edge.m | 4 ++++ tikzit/src/common/GraphChange.m | 39 +++++++++++++++++++------------- tikzit/src/common/GraphElementProperty.h | 4 ++-- tikzit/src/common/GraphElementProperty.m | 17 +++++++------- tikzit/src/common/Node.m | 1 + tikzit/src/common/tikzparser.ym | 6 +++-- tikzit/src/gtk/Configuration.m | 4 ++++ tikzit/src/gtk/GraphEditorPanel.m | 5 +++- tikzit/src/gtk/Menu.m | 2 ++ tikzit/src/gtk/PropertiesPane.m | 12 ++++++++++ tikzit/src/gtk/PropertyListEditor.h | 5 ++-- tikzit/src/gtk/PropertyListEditor.m | 7 ++++++ tikzit/src/gtk/main.m | 1 + 13 files changed, 76 insertions(+), 31 deletions(-) diff --git a/tikzit/src/common/Edge.m b/tikzit/src/common/Edge.m index dfc505c..945503f 100644 --- a/tikzit/src/common/Edge.m +++ b/tikzit/src/common/Edge.m @@ -640,6 +640,10 @@ } - (void)dealloc { + [source removeObserver:self + forKeyPath:@"style"]; + [target removeObserver:self + forKeyPath:@"style"]; [source release]; [target release]; [data release]; diff --git a/tikzit/src/common/GraphChange.m b/tikzit/src/common/GraphChange.m index cb95332..239ae23 100644 --- a/tikzit/src/common/GraphChange.m +++ b/tikzit/src/common/GraphChange.m @@ -35,6 +35,29 @@ return [super init]; } +- (void)dealloc { + [affectedNodes release]; + [affectedEdges release]; + [nodeRef release]; + [edgeRef release]; + [oldNode release]; + [nwNode release]; + [oldEdge release]; + [nwEdge release]; + [oldNodeTable release]; + [nwNodeTable release]; + [oldEdgeTable release]; + [nwEdgeTable release]; + [oldGraphData release]; + [nwGraphData release]; + [oldNodeOrder release]; + [nwNodeOrder release]; + [oldEdgeOrder release]; + [nwEdgeOrder release]; + + [super dealloc]; +} + @synthesize changeType; @synthesize shiftPoint, horizontal; @synthesize affectedEdges, affectedNodes; @@ -115,22 +138,6 @@ return [inverse autorelease]; } -- (void)dealloc { - [affectedNodes release]; - [affectedEdges release]; - [nodeRef release]; - [oldNode release]; - [nwNode release]; - [edgeRef release]; - [oldEdge release]; - [oldNodeTable release]; - [nwNodeTable release]; - [oldEdgeTable release]; - [nwEdgeTable release]; - - [super dealloc]; -} - + (GraphChange*)graphAdditionWithNodes:(NSSet *)ns edges:(NSSet *)es { GraphChange *gc = [[GraphChange alloc] init]; [gc setChangeType:GraphAddition]; diff --git a/tikzit/src/common/GraphElementProperty.h b/tikzit/src/common/GraphElementProperty.h index 029e7f3..057cdbb 100644 --- a/tikzit/src/common/GraphElementProperty.h +++ b/tikzit/src/common/GraphElementProperty.h @@ -35,8 +35,8 @@ BOOL isKeyMatch; } -@property (readwrite,retain) NSString *key; -@property (readwrite,retain) NSString *value; +@property (copy) NSString *key; +@property (copy) NSString *value; @property (readonly) BOOL isAtom; @property (readonly) BOOL isKeyMatch; diff --git a/tikzit/src/common/GraphElementProperty.m b/tikzit/src/common/GraphElementProperty.m index 5a19ace..3cf6632 100644 --- a/tikzit/src/common/GraphElementProperty.m +++ b/tikzit/src/common/GraphElementProperty.m @@ -41,9 +41,7 @@ self = [super init]; if (self) { [self setKey:n]; - [self setValue:nil]; isAtom = YES; - isKeyMatch = NO; } return self; } @@ -53,8 +51,6 @@ if (self) { [self setKey:k]; [self setValue:v]; - isAtom = NO; - isKeyMatch = NO; } return self; } @@ -63,13 +59,17 @@ self = [super init]; if (self) { [self setKey:k]; - [self setValue:nil]; - isAtom = NO; isKeyMatch = YES; } return self; } +- (void) dealloc { + [key release]; + [value release]; + [super dealloc]; +} + - (void)setValue:(NSString *)v { if (value != v) { [value release]; @@ -87,11 +87,12 @@ - (void)setKey:(NSString *)k { - if (k == nil) k = @""; // don't allow nil keys if (key != k) { [key release]; - key = [k retain]; + key = [k copy]; } + if (key == nil) + key = @""; // don't allow nil keys } - (NSString*)key { diff --git a/tikzit/src/common/Node.m b/tikzit/src/common/Node.m index e564e5d..8c64b6b 100644 --- a/tikzit/src/common/Node.m +++ b/tikzit/src/common/Node.m @@ -53,6 +53,7 @@ [name release]; [style release]; [data release]; + [label release]; [super dealloc]; } diff --git a/tikzit/src/common/tikzparser.ym b/tikzit/src/common/tikzparser.ym index d0ced92..794b06d 100644 --- a/tikzit/src/common/tikzparser.ym +++ b/tikzit/src/common/tikzparser.ym @@ -148,7 +148,7 @@ val: PROPSTRING { $$ = $1; } | DELIMITEDSTRING { $$ = $1; }; nodename: "(" REFSTRING ")" { $$ = $2; }; node: "\\node" optproperties nodename "at" COORD DELIMITEDSTRING ";" { - Node *node = [Node node]; + Node *node = [[Node alloc] init]; if ($2) [node setData:$2]; [node setName:$3]; @@ -156,6 +156,7 @@ node: "\\node" optproperties nodename "at" COORD DELIMITEDSTRING ";" [node setLabel:$6]; [assembler addNodeToMap:node]; [[assembler graph] addNode:node]; + [node release]; }; optanchor: { $$ = nil; } | "." REFSTRING { $$ = $2; }; @@ -178,7 +179,7 @@ optedgenode: } edge: "\\draw" optproperties noderef "to" optedgenode optnoderef ";" { - Edge *edge = [Edge edge]; + Edge *edge = [[Edge alloc] init]; if ($2) [edge setData:$2]; [edge setSource:$3.node]; @@ -193,6 +194,7 @@ edge: "\\draw" optproperties noderef "to" optedgenode optnoderef ";" } [edge setAttributesFromData]; [[assembler graph] addEdge:edge]; + [edge release]; }; ignoreprop: val | val "=" val; diff --git a/tikzit/src/gtk/Configuration.m b/tikzit/src/gtk/Configuration.m index 6ac08e8..4a3ed79 100644 --- a/tikzit/src/gtk/Configuration.m +++ b/tikzit/src/gtk/Configuration.m @@ -272,6 +272,7 @@ for (int i = 0; i < length; ++i) { [result addObject:[NSString stringWithUTF8String:list[i]]]; } + g_strfreev (list); return result; } else { return def; @@ -292,6 +293,7 @@ for (int i = 0; i < length; ++i) { [result addObject:[NSNumber numberWithBool:list[i]]]; } + g_free (list); return result; } else { return def; @@ -312,6 +314,7 @@ for (int i = 0; i < length; ++i) { [result addObject:[NSNumber numberWithInt:list[i]]]; } + g_free (list); return result; } else { return def; @@ -332,6 +335,7 @@ for (int i = 0; i < length; ++i) { [result addObject:[NSNumber numberWithDouble:list[i]]]; } + g_free (list); return result; } else { return def; diff --git a/tikzit/src/gtk/GraphEditorPanel.m b/tikzit/src/gtk/GraphEditorPanel.m index a1c63a2..fc50afc 100644 --- a/tikzit/src/gtk/GraphEditorPanel.m +++ b/tikzit/src/gtk/GraphEditorPanel.m @@ -125,9 +125,12 @@ return self; } - (id) init { - [self dealloc]; + [self release]; return nil; } +- (void) dealloc { + [super dealloc]; +} // FIXME: use a local copy of HandTool to implement CTRL-dragging - (void) mousePressAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask { diff --git a/tikzit/src/gtk/Menu.m b/tikzit/src/gtk/Menu.m index 677b48f..0eb8ba8 100644 --- a/tikzit/src/gtk/Menu.m +++ b/tikzit/src/gtk/Menu.m @@ -679,8 +679,10 @@ static void tool_cb (GtkAction *action, id tool) { - (void) dealloc { g_free (nodeSelBasedActions); + g_free (edgeSelBasedActions); g_free (selBasedActions); g_object_unref (menubar); + g_object_unref (appActions); g_object_unref (windowActions); [super dealloc]; diff --git a/tikzit/src/gtk/PropertiesPane.m b/tikzit/src/gtk/PropertiesPane.m index a062bae..c42dded 100644 --- a/tikzit/src/gtk/PropertiesPane.m +++ b/tikzit/src/gtk/PropertiesPane.m @@ -463,6 +463,10 @@ static void edge_node_toggled_cb (GtkToggleButton *widget, PropertiesPane *pane) } return self; } +- (void) dealloc { + // doc is not retained + [super dealloc]; +} - (void) setDocument:(TikzDocument*)d { doc = d; } @@ -490,6 +494,10 @@ static void edge_node_toggled_cb (GtkToggleButton *widget, PropertiesPane *pane) } return self; } +- (void) dealloc { + // doc,node not retained + [super dealloc]; +} - (void) setDocument:(TikzDocument*)d { doc = d; node = nil; @@ -521,6 +529,10 @@ static void edge_node_toggled_cb (GtkToggleButton *widget, PropertiesPane *pane) } return self; } +- (void) dealloc { + // doc,edge not retained + [super dealloc]; +} - (void) setDocument:(TikzDocument*)d { doc = d; edge = nil; diff --git a/tikzit/src/gtk/PropertyListEditor.h b/tikzit/src/gtk/PropertyListEditor.h index 85fa8d2..2d3166a 100644 --- a/tikzit/src/gtk/PropertyListEditor.h +++ b/tikzit/src/gtk/PropertyListEditor.h @@ -28,12 +28,13 @@ @end @interface PropertyListEditor: NSObject { + GraphElementData *data; + NSObject *delegate; + GtkListStore *list; GtkWidget *view; - GraphElementData *data; GtkWidget *widget; GtkWidget *removeButton; - NSObject *delegate; } /*! diff --git a/tikzit/src/gtk/PropertyListEditor.m b/tikzit/src/gtk/PropertyListEditor.m index bc6d7ba..428050e 100644 --- a/tikzit/src/gtk/PropertyListEditor.m +++ b/tikzit/src/gtk/PropertyListEditor.m @@ -83,7 +83,9 @@ static void selection_changed_cb (GtkTreeSelection *selection, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_POINTER); + g_object_ref_sink (G_OBJECT (list)); view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list)); + g_object_ref_sink (G_OBJECT (view)); GtkWidget *scrolledview = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledview), GTK_POLICY_AUTOMATIC, @@ -197,10 +199,15 @@ static void selection_changed_cb (GtkTreeSelection *selection, - (void) dealloc { [self clearStore]; + [data release]; + [delegate release]; + g_object_unref (list); + g_object_unref (view); g_object_unref (widget); g_object_unref (removeButton); + [super dealloc]; } diff --git a/tikzit/src/gtk/main.m b/tikzit/src/gtk/main.m index f56a7b1..5d9f4a4 100644 --- a/tikzit/src/gtk/main.m +++ b/tikzit/src/gtk/main.m @@ -62,6 +62,7 @@ int main (int argc, char *argv[]) { } exit (1); } + g_option_context_free (context); #ifndef WINDOWS GList *icon_list = NULL; -- cgit v1.2.3