summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Merry <dev@randomguy3.me.uk>2013-03-25 18:15:11 +0000
committerAlex Merry <dev@randomguy3.me.uk>2013-03-25 18:36:52 +0000
commit0f969b6ced7e9ebcbe4bc4e17867ff32d67f27bb (patch)
tree9632ffa948332d8636c15537cb19356781a215ec
parent1b83e14b1f5640881deeb03c1d11df5197746b64 (diff)
Catch some memory leaks
Memory usage on Linux no longer shoots up after running the tikz parser a handful of times.
-rw-r--r--tikzit/src/common/Edge.m4
-rw-r--r--tikzit/src/common/GraphChange.m39
-rw-r--r--tikzit/src/common/GraphElementProperty.h4
-rw-r--r--tikzit/src/common/GraphElementProperty.m17
-rw-r--r--tikzit/src/common/Node.m1
-rw-r--r--tikzit/src/common/tikzparser.ym6
-rw-r--r--tikzit/src/gtk/Configuration.m4
-rw-r--r--tikzit/src/gtk/GraphEditorPanel.m5
-rw-r--r--tikzit/src/gtk/Menu.m2
-rw-r--r--tikzit/src/gtk/PropertiesPane.m12
-rw-r--r--tikzit/src/gtk/PropertyListEditor.h5
-rw-r--r--tikzit/src/gtk/PropertyListEditor.m7
-rw-r--r--tikzit/src/gtk/main.m1
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> 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<PropertyChangeDelegate> *delegate;
+
GtkListStore *list;
GtkWidget *view;
- GraphElementData *data;
GtkWidget *widget;
GtkWidget *removeButton;
- NSObject<PropertyChangeDelegate> *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;