From 07153a65be142583856fb4f696e7f8c432197048 Mon Sep 17 00:00:00 2001 From: Sven Weidauer Date: Sat, 13 Jul 2013 14:31:54 +0200 Subject: [PATCH 1/9] Break retain cycle from PBGitWindowController to PBViewController subclasses. --- Classes/Controllers/PBGitWindowController.m | 10 +++++++++- Classes/Controllers/PBViewController.h | 4 +++- Classes/Controllers/PBViewController.m | 5 +++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Classes/Controllers/PBGitWindowController.m b/Classes/Controllers/PBGitWindowController.m index 245056926..1f5e3c12f 100644 --- a/Classes/Controllers/PBGitWindowController.m +++ b/Classes/Controllers/PBGitWindowController.m @@ -107,8 +107,10 @@ - (void) changeContentController:(PBViewController *)controller if (!controller || (contentController == controller)) return; - if (contentController) + if (contentController) { [contentController removeObserver:self forKeyPath:@"status"]; + [contentController didMoveFromSupercontroller]; + } [self removeAllContentSubViews]; @@ -300,4 +302,10 @@ - (void)splitView:(NSSplitView *)sender resizeSubviewsWithOldSize:(NSSize)oldSiz [mainView setFrame:mainFrame]; } +- (void)dealloc; +{ + NSLog( @"%@ dealloc", self.class ); + [contentController didMoveFromSupercontroller]; +} + @end diff --git a/Classes/Controllers/PBViewController.h b/Classes/Controllers/PBViewController.h index dc574d949..aa68572ae 100644 --- a/Classes/Controllers/PBViewController.h +++ b/Classes/Controllers/PBViewController.h @@ -12,7 +12,7 @@ @interface PBViewController : NSViewController { __weak PBGitRepository *repository; - PBGitWindowController *superController; + __unsafe_unretained PBGitWindowController *superController; NSString *status; BOOL isBusy; @@ -39,4 +39,6 @@ - (NSResponder *)firstResponder; - (IBAction) refresh:(id)sender; +- (void)didMoveFromSupercontroller; + @end diff --git a/Classes/Controllers/PBViewController.m b/Classes/Controllers/PBViewController.m index a2cfadeac..e0f939d0c 100644 --- a/Classes/Controllers/PBViewController.m +++ b/Classes/Controllers/PBViewController.m @@ -61,4 +61,9 @@ - (void)viewLoaded { } +- (void)didMoveFromSupercontroller; +{ + superController = nil; +} + @end From ee76a7d960a96f5988eab116da8180aa0412ac38 Mon Sep 17 00:00:00 2001 From: Sven Weidauer Date: Sat, 13 Jul 2013 15:01:43 +0200 Subject: [PATCH 2/9] Made outlets to subviews weak. --- Classes/Controllers/PBGitWindowController.h | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/Classes/Controllers/PBGitWindowController.h b/Classes/Controllers/PBGitWindowController.h index eebf93777..6aede1934 100644 --- a/Classes/Controllers/PBGitWindowController.h +++ b/Classes/Controllers/PBGitWindowController.h @@ -15,18 +15,15 @@ PBViewController *contentController; PBGitSidebarController *sidebarController; - IBOutlet NSView *sourceListControlsView; - IBOutlet NSSplitView *splitView; - IBOutlet NSView *sourceSplitView; - IBOutlet NSView *contentSplitView; - IBOutlet NSTextField *statusField; - IBOutlet NSProgressIndicator *progressIndicator; - - PBViewController* viewController; - - IBOutlet NSToolbarItem *terminalItem; - IBOutlet NSToolbarItem *finderItem; + IBOutlet __weak NSView *sourceListControlsView; + IBOutlet __weak NSSplitView *splitView; + IBOutlet __weak NSView *sourceSplitView; + IBOutlet __weak NSView *contentSplitView; + IBOutlet __weak NSTextField *statusField; + IBOutlet __weak NSProgressIndicator *progressIndicator; + IBOutlet __weak NSToolbarItem *terminalItem; + IBOutlet __weak NSToolbarItem *finderItem; } @property (nonatomic, weak) PBGitRepository *repository; From 56473514f3a5d69edb19b7d07b89a572a42b19bb Mon Sep 17 00:00:00 2001 From: Sven Weidauer Date: Sat, 13 Jul 2013 15:11:06 +0200 Subject: [PATCH 3/9] Break retain cycles by making all outlets weak except for ones that refer top level elements. --- Classes/Controllers/PBGitCommitController.h | 7 ++++--- Classes/Controllers/PBGitSidebarController.h | 7 +++---- Classes/Controllers/PBGitSidebarController.m | 2 -- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/Classes/Controllers/PBGitCommitController.h b/Classes/Controllers/PBGitCommitController.h index aac727fc8..b014049be 100644 --- a/Classes/Controllers/PBGitCommitController.h +++ b/Classes/Controllers/PBGitCommitController.h @@ -17,14 +17,15 @@ // object sometime PBGitIndex *index; - IBOutlet NSTextView *commitMessageView; + IBOutlet __unsafe_unretained NSTextView *commitMessageView; + IBOutlet __weak NSButton *commitButton; + IBOutlet __weak PBNiceSplitView *commitSplitView; + IBOutlet NSArrayController *unstagedFilesController; IBOutlet NSArrayController *cachedFilesController; - IBOutlet NSButton *commitButton; IBOutlet PBGitIndexController *indexController; IBOutlet PBWebChangesController *webController; - IBOutlet PBNiceSplitView *commitSplitView; } @property(readonly) PBGitIndex *index; diff --git a/Classes/Controllers/PBGitSidebarController.h b/Classes/Controllers/PBGitSidebarController.h index e28936c33..4c4d3ddd3 100644 --- a/Classes/Controllers/PBGitSidebarController.h +++ b/Classes/Controllers/PBGitSidebarController.h @@ -14,11 +14,10 @@ @class PBGitCommitController; @interface PBGitSidebarController : PBViewController { - IBOutlet NSWindow *window; - IBOutlet NSOutlineView *sourceView; + IBOutlet __weak NSOutlineView *sourceView; IBOutlet NSView *sourceListControlsView; - IBOutlet NSPopUpButton *actionButton; - IBOutlet NSSegmentedControl *remoteControls; + IBOutlet __weak NSPopUpButton *actionButton; + IBOutlet __weak NSSegmentedControl *remoteControls; NSMutableArray *items; diff --git a/Classes/Controllers/PBGitSidebarController.m b/Classes/Controllers/PBGitSidebarController.m index d7ed42b61..d1f50bb72 100644 --- a/Classes/Controllers/PBGitSidebarController.m +++ b/Classes/Controllers/PBGitSidebarController.m @@ -36,7 +36,6 @@ @implementation PBGitSidebarController - (id)initWithRepository:(PBGitRepository *)theRepository superController:(PBGitWindowController *)controller { self = [super initWithRepository:theRepository superController:controller]; - [sourceView setDelegate:self]; items = [NSMutableArray array]; return self; @@ -45,7 +44,6 @@ - (id)initWithRepository:(PBGitRepository *)theRepository superController:(PBGit - (void)awakeFromNib { [super awakeFromNib]; - window.contentView = self.view; [self populateList]; historyViewController = [[PBGitHistoryController alloc] initWithRepository:repository superController:superController]; From 47e050018e3cee6a03efd6edaa7f2dbe4650b78a Mon Sep 17 00:00:00 2001 From: Sven Weidauer Date: Sat, 13 Jul 2013 15:15:41 +0200 Subject: [PATCH 4/9] Update outlets for OpenRecentController to weak. --- Classes/Controllers/OpenRecentController.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Classes/Controllers/OpenRecentController.h b/Classes/Controllers/OpenRecentController.h index 3a9dcc1e7..55a90478b 100644 --- a/Classes/Controllers/OpenRecentController.h +++ b/Classes/Controllers/OpenRecentController.h @@ -10,9 +10,9 @@ @interface OpenRecentController : NSWindowController { - IBOutlet NSSearchField* searchField; + IBOutlet __weak NSSearchField* searchField; NSURL* selectedResult; - IBOutlet NSTableView* resultViewer; + IBOutlet __weak NSTableView* resultViewer; } @property (strong) NSMutableArray* currentResults; From 7f07f7f1856bfac53e4c081255556e96a6a6a57f Mon Sep 17 00:00:00 2001 From: Sven Weidauer Date: Sat, 13 Jul 2013 15:32:31 +0200 Subject: [PATCH 5/9] Made more outlets for subviews weak. --- Classes/Controllers/PBGitHistoryController.h | 26 ++++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/Classes/Controllers/PBGitHistoryController.h b/Classes/Controllers/PBGitHistoryController.h index 4a0be5376..f28ab8d95 100644 --- a/Classes/Controllers/PBGitHistoryController.h +++ b/Classes/Controllers/PBGitHistoryController.h @@ -24,29 +24,29 @@ @interface PBGitHistoryController : PBViewController { IBOutlet PBRefController *refController; - IBOutlet NSSearchField *searchField; + IBOutlet __weak NSSearchField *searchField; IBOutlet NSArrayController* commitController; IBOutlet NSTreeController* treeController; - IBOutlet NSOutlineView* fileBrowser; + IBOutlet __weak NSOutlineView* fileBrowser; NSArray *currentFileBrowserSelectionPath; - IBOutlet PBCommitList* commitList; - IBOutlet PBCollapsibleSplitView *historySplitView; + IBOutlet __weak PBCommitList* commitList; + IBOutlet __weak PBCollapsibleSplitView *historySplitView; IBOutlet PBWebHistoryController *webHistoryController; QLPreviewPanel* previewPanel; IBOutlet PBHistorySearchController *searchController; IBOutlet GLFileView *fileView; - IBOutlet PBGitGradientBarView *upperToolbarView; - IBOutlet NSButton *mergeButton; - IBOutlet NSButton *cherryPickButton; - IBOutlet NSButton *rebaseButton; + IBOutlet __weak PBGitGradientBarView *upperToolbarView; + IBOutlet __weak NSButton *mergeButton; + IBOutlet __weak NSButton *cherryPickButton; + IBOutlet __weak NSButton *rebaseButton; - IBOutlet PBGitGradientBarView *scopeBarView; - IBOutlet NSButton *allBranchesFilterItem; - IBOutlet NSButton *localRemoteBranchesFilterItem; - IBOutlet NSButton *selectedBranchFilterItem; + IBOutlet __weak PBGitGradientBarView *scopeBarView; + IBOutlet __weak NSButton *allBranchesFilterItem; + IBOutlet __weak NSButton *localRemoteBranchesFilterItem; + IBOutlet __weak NSButton *selectedBranchFilterItem; - IBOutlet id webView; + IBOutlet __weak id webView; int selectedCommitDetailsIndex; BOOL forceSelectionUpdate; From 5082c8fde02b49587dc1d5ec69e127de5cedbbb2 Mon Sep 17 00:00:00 2001 From: Sven Weidauer Date: Sat, 13 Jul 2013 15:50:55 +0200 Subject: [PATCH 6/9] More weak/unsafe_unretained outlets. That should have been all retain cycles now. Finally the git repository gets deallocated after the window is closed. --- Classes/Controllers/PBGitHistoryController.h | 2 +- Classes/Controllers/PBRefController.h | 4 ++-- Classes/Controllers/PBWebHistoryController.h | 4 ++-- Classes/PBCommitList.h | 8 ++++---- Classes/Views/GLFileView.h | 8 ++++---- Classes/Views/PBGitRevisionCell.h | 4 ++-- Classes/Views/PBQLOutlineView.h | 2 +- Classes/Views/PBQLTextView.h | 2 +- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Classes/Controllers/PBGitHistoryController.h b/Classes/Controllers/PBGitHistoryController.h index f28ab8d95..9a11a2713 100644 --- a/Classes/Controllers/PBGitHistoryController.h +++ b/Classes/Controllers/PBGitHistoryController.h @@ -62,7 +62,7 @@ @property (readonly) NSArrayController *commitController; @property (readonly) PBRefController *refController; @property (readonly) PBHistorySearchController *searchController; -@property (readonly) PBCommitList *commitList; +@property (weak, readonly) PBCommitList *commitList; - (IBAction) setDetailedView:(id)sender; - (IBAction) setTreeView:(id)sender; diff --git a/Classes/Controllers/PBRefController.h b/Classes/Controllers/PBRefController.h index a9c11f4c2..dfc63bbcc 100644 --- a/Classes/Controllers/PBRefController.h +++ b/Classes/Controllers/PBRefController.h @@ -16,9 +16,9 @@ @class PBRefMenuItem; @interface PBRefController : NSObject { - IBOutlet PBGitHistoryController *historyController; + IBOutlet __unsafe_unretained PBGitHistoryController *historyController; IBOutlet NSArrayController *commitController; - IBOutlet PBCommitList *commitList; + IBOutlet __weak PBCommitList *commitList; IBOutlet NSPopUpButton *branchPopUp; } diff --git a/Classes/Controllers/PBWebHistoryController.h b/Classes/Controllers/PBWebHistoryController.h index f42a42e9f..255463fb0 100644 --- a/Classes/Controllers/PBWebHistoryController.h +++ b/Classes/Controllers/PBWebHistoryController.h @@ -18,8 +18,8 @@ @interface PBWebHistoryController : PBWebController { - IBOutlet PBGitHistoryController* historyController; - IBOutlet id contextMenuDelegate; + IBOutlet __unsafe_unretained PBGitHistoryController* historyController; + IBOutlet __weak id contextMenuDelegate; PBGitSHA* currentSha; NSString* diff; diff --git a/Classes/PBCommitList.h b/Classes/PBCommitList.h index 3829a41d5..fcaf23daa 100644 --- a/Classes/PBCommitList.h +++ b/Classes/PBCommitList.h @@ -13,10 +13,10 @@ @class PBWebHistoryController; @interface PBCommitList : NSTableView { - IBOutlet WebView* webView; - IBOutlet PBWebHistoryController *webController; - IBOutlet PBGitHistoryController *controller; - IBOutlet PBHistorySearchController *searchController; + IBOutlet __weak WebView* webView; + IBOutlet __weak PBWebHistoryController *webController; + IBOutlet __unsafe_unretained PBGitHistoryController *controller; + IBOutlet __weak PBHistorySearchController *searchController; BOOL useAdjustScroll; NSPoint mouseDownPoint; diff --git a/Classes/Views/GLFileView.h b/Classes/Views/GLFileView.h index 9dae09fdf..3356fc356 100644 --- a/Classes/Views/GLFileView.h +++ b/Classes/Views/GLFileView.h @@ -16,12 +16,12 @@ @class PBGitGradientBarView; @interface GLFileView : PBWebController { - IBOutlet PBGitHistoryController* historyController; - IBOutlet MGScopeBar *typeBar; + IBOutlet __unsafe_unretained PBGitHistoryController* historyController; + IBOutlet __weak MGScopeBar *typeBar; NSMutableArray *groups; NSString *logFormat; - IBOutlet NSView *accessoryView; - IBOutlet NSSplitView *fileListSplitView; + IBOutlet __weak NSView *accessoryView; + IBOutlet __weak NSSplitView *fileListSplitView; } - (void)showFile; diff --git a/Classes/Views/PBGitRevisionCell.h b/Classes/Views/PBGitRevisionCell.h index 8c9fd9532..c2983f31f 100644 --- a/Classes/Views/PBGitRevisionCell.h +++ b/Classes/Views/PBGitRevisionCell.h @@ -16,8 +16,8 @@ PBGitCommit *objectValue; PBGraphCellInfo *cellInfo; NSTextFieldCell *textCell; - IBOutlet PBGitHistoryController *controller; - IBOutlet id contextMenuDelegate; + IBOutlet __unsafe_unretained PBGitHistoryController *controller; + IBOutlet __weak id contextMenuDelegate; } - (int) indexAtX:(float)x; diff --git a/Classes/Views/PBQLOutlineView.h b/Classes/Views/PBQLOutlineView.h index d0f8284ba..57a7196d8 100644 --- a/Classes/Views/PBQLOutlineView.h +++ b/Classes/Views/PBQLOutlineView.h @@ -10,7 +10,7 @@ #import "PBGitHistoryController.h" @interface PBQLOutlineView : NSOutlineView { - IBOutlet PBGitHistoryController* controller; + IBOutlet __unsafe_unretained PBGitHistoryController* controller; } @end diff --git a/Classes/Views/PBQLTextView.h b/Classes/Views/PBQLTextView.h index 715e74efe..a95ebfe69 100644 --- a/Classes/Views/PBQLTextView.h +++ b/Classes/Views/PBQLTextView.h @@ -13,7 +13,7 @@ @interface PBQLTextView : NSTextView { - IBOutlet PBGitHistoryController *controller; + IBOutlet __unsafe_unretained PBGitHistoryController *controller; } @end From 3601e98d08290931b48f5d2298c93dda734ad922 Mon Sep 17 00:00:00 2001 From: Sven Weidauer Date: Sat, 13 Jul 2013 15:59:02 +0200 Subject: [PATCH 7/9] made git history grapher delegate weak. --- Classes/git/PBGitHistoryGrapher.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/git/PBGitHistoryGrapher.h b/Classes/git/PBGitHistoryGrapher.h index 0e02e6a3e..06a475531 100644 --- a/Classes/git/PBGitHistoryGrapher.h +++ b/Classes/git/PBGitHistoryGrapher.h @@ -17,7 +17,7 @@ @interface PBGitHistoryGrapher : NSObject { - id delegate; + __weak id delegate; NSOperationQueue *currentQueue; NSMutableSet *searchSHAs; From ce852b2d85e7386dadf28c71e7c867d1bf0c7950 Mon Sep 17 00:00:00 2001 From: Sven Weidauer Date: Sat, 13 Jul 2013 16:11:27 +0200 Subject: [PATCH 8/9] nil out currentRevList in cleanup so the observer will not be removed a second time. --- Classes/git/PBGitHistoryList.m | 1 + 1 file changed, 1 insertion(+) diff --git a/Classes/git/PBGitHistoryList.m b/Classes/git/PBGitHistoryList.m index c5d6513b1..3a5027e69 100644 --- a/Classes/git/PBGitHistoryList.m +++ b/Classes/git/PBGitHistoryList.m @@ -93,6 +93,7 @@ - (void)cleanup if (currentRevList) { [currentRevList removeObserver:self forKeyPath:@"commits"]; [currentRevList cancel]; + currentRevList = nil; } [graphQueue cancelAllOperations]; From a63326a533a9da45f87e9ea9154d159472beaeba Mon Sep 17 00:00:00 2001 From: Sven Weidauer Date: Sat, 13 Jul 2013 16:19:49 +0200 Subject: [PATCH 9/9] Fix leak by freeing looked-up tag --- Classes/git/PBGitRepository.m | 1 + 1 file changed, 1 insertion(+) diff --git a/Classes/git/PBGitRepository.m b/Classes/git/PBGitRepository.m index f0e1d07df..38bf110ad 100644 --- a/Classes/git/PBGitRepository.m +++ b/Classes/git/PBGitRepository.m @@ -213,6 +213,7 @@ - (void) addRef:(GTReference*)gtRef // NSLog(@"peeled sha:%@", peeledObject.sha); sha = [PBGitSHA shaWithString:peeledObject.sha]; } + git_tag_free(gitTag); } PBGitRef* ref = [[PBGitRef alloc] initWithString:gtRef.name];