From 1fcf13d149756d61dd90d3621623b9d36b459c25 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 20 Aug 2014 16:13:59 -0700 Subject: [PATCH] Fixed: added optimization for releasing observers --- AppKit/CPClipView.j | 6 +++++ AppKit/CPDatePicker/_CPDatePickerTextField.j | 12 ++++++++++ .../CPRuleEditor/_CPRuleEditorViewSliceRow.j | 23 ++++++++++++++++--- AppKit/CPSearchField.j | 6 +++++ AppKit/CPTableView.j | 6 +++++ AppKit/CPTextField.j | 6 +++++ AppKit/CPView.j | 3 +++ 7 files changed, 59 insertions(+), 3 deletions(-) diff --git a/AppKit/CPClipView.j b/AppKit/CPClipView.j index 6c941aace..8128cc4bc 100644 --- a/AppKit/CPClipView.j +++ b/AppKit/CPClipView.j @@ -97,6 +97,9 @@ - (void)_addObservers { + if (_isObserving) + return; + [super _addObservers]; if (_documentView) @@ -105,6 +108,9 @@ - (void)_removeObservers { + if (!_isObserving) + return; + [super _removeObservers]; if (_documentView) diff --git a/AppKit/CPDatePicker/_CPDatePickerTextField.j b/AppKit/CPDatePicker/_CPDatePickerTextField.j index d991f5006..882747a6e 100644 --- a/AppKit/CPDatePicker/_CPDatePickerTextField.j +++ b/AppKit/CPDatePicker/_CPDatePickerTextField.j @@ -414,6 +414,9 @@ var CPZeroKeyCode = 48, - (void)_removeObservers { + if (!_isObserving) + return; + [super _removeObservers]; [[CPNotificationCenter defaultCenter] removeObserver:self name:CPDatePickerElementTextFieldBecomeFirstResponder object:self]; @@ -421,6 +424,9 @@ var CPZeroKeyCode = 48, - (void)_addObservers { + if (_isObserving) + return; + [super _addObservers]; [[CPNotificationCenter defaultCenter] addObserver:self selector:@selector(_datePickerElementTextFieldBecomeFirstResponder:) name:CPDatePickerElementTextFieldBecomeFirstResponder object:self]; @@ -554,6 +560,9 @@ var CPZeroKeyCode = 48, - (void)_removeObservers { + if (!_isObserving) + return; + [super _removeObservers]; [[CPNotificationCenter defaultCenter] removeObserver:self name:CPDatePickerElementTextFieldAMPMChangedNotification object:_textFieldPMAM]; @@ -561,6 +570,9 @@ var CPZeroKeyCode = 48, - (void)_addObservers { + if (_isObserving) + return; + [super _addObservers]; [[CPNotificationCenter defaultCenter] addObserver:self selector:@selector(_datePickerElementTextFieldAMPMChangedNotification:) name:CPDatePickerElementTextFieldAMPMChangedNotification object:_textFieldPMAM]; diff --git a/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j b/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j index 20b573790..c06f3021b 100644 --- a/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j +++ b/AppKit/CPRuleEditor/_CPRuleEditorViewSliceRow.j @@ -65,9 +65,6 @@ var CONTROL_HEIGHT = 16., [self addSubview:_subtractButton]; [self setAutoresizingMask:CPViewWidthSizable]; - - var center = [CPNotificationCenter defaultCenter]; - [center addObserver:self selector:@selector(_textDidChange:) name:CPControlTextDidChangeNotification object:nil]; } - (CPButton)_createRowButton @@ -481,6 +478,26 @@ var CONTROL_HEIGHT = 16., [self layoutSubviews]; } +- (void)_addObservers +{ + if (_isObserving) + return; + + [super _addObservers]; + + [[CPNotificationCenter defaultCenter] addObserver:self selector:@selector(_textDidChange:) name:CPControlTextDidChangeNotification object:nil]; +} + +- (void)_removeObservers +{ + if (!_isObserving) + return; + + [super _removeObservers]; + + [[CPNotificationCenter defaultCenter] removeObserver:self name:CPControlTextDidChangeNotification object:nil]; +} + - (void)drawRect:(CGRect)rect { [super drawRect:rect]; diff --git a/AppKit/CPSearchField.j b/AppKit/CPSearchField.j index 0f6d9d9e4..c26e79140 100644 --- a/AppKit/CPSearchField.j +++ b/AppKit/CPSearchField.j @@ -125,6 +125,9 @@ var RECENT_SEARCH_PREFIX = @" "; - (void)_removeObservers { + if (!_isObserving) + return; + [super _removeObservers]; [[CPNotificationCenter defaultCenter] removeObserver:self name:CPControlTextDidChangeNotification object:self]; @@ -132,6 +135,9 @@ var RECENT_SEARCH_PREFIX = @" "; - (void)_addObservers { + if (_isObserving) + return; + [super _addObservers]; [[CPNotificationCenter defaultCenter] addObserver:self selector:@selector(_searchFieldTextDidChange:) name:CPControlTextDidChangeNotification object:self]; diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index ebeb66e19..eed697cf8 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -5127,12 +5127,18 @@ Your delegate can implement this method to avoid subclassing the tableview to ad - (void)_removeObservers { + if (!_isObserving) + return; + [super _removeObservers]; [self _stopObservingFirstResponder]; } - (void)_addObservers { + if (_isObserving) + return; + [super _addObservers]; [self _startObservingFirstResponder]; } diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 6b1591222..523d56bd4 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -822,12 +822,18 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); - (void)_removeObservers { + if (!_isObserving) + return; + [super _removeObservers]; [self _setObserveWindowKeyNotifications:NO]; } - (void)_addObservers { + if (_isObserving) + return; + [super _addObservers]; if ([self window] === self) diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 8218bffd7..90f3cd529 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -842,6 +842,9 @@ var CPViewFlags = { }, - (void)_removeObservers { + if (!_isObserving) + return; + var count = [_subviews count]; while (count--)