diff options
author | adrianknight89 <adrianknight89@outlook.com> | 2017-02-15 05:38:22 -0600 |
---|---|---|
committer | Rui Marinho <me@ruimarinho.net> | 2017-02-15 11:38:22 +0000 |
commit | 340a705c5e2f912f97e8e276215de4ff20583e59 (patch) | |
tree | 265efb6f7a5b8e1fc9ab922b9e3b79e5208e43d5 /Xamarin.Forms.Platform.iOS | |
parent | 4464db59e55819a838d5b1f4ccba8ff350413748 (diff) | |
download | xamarin-forms-340a705c5e2f912f97e8e276215de4ff20583e59.tar.gz xamarin-forms-340a705c5e2f912f97e8e276215de4ff20583e59.tar.bz2 xamarin-forms-340a705c5e2f912f97e8e276215de4ff20583e59.zip |
[iOS] Dispose pickers properly and automate GC checks (#632)
* dispose datepicker
* add dispose to other pickers
* add ui test
* add dispose to picker model
* change class name
Diffstat (limited to 'Xamarin.Forms.Platform.iOS')
3 files changed, 113 insertions, 14 deletions
diff --git a/Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs index 710aa364..39e7ab77 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs @@ -22,6 +22,7 @@ namespace Xamarin.Forms.Platform.iOS { UIDatePicker _picker; UIColor _defaultTextColor; + bool _disposed; IElementController ElementController => Element as IElementController; @@ -29,7 +30,10 @@ namespace Xamarin.Forms.Platform.iOS { base.OnElementChanged(e); - if (e.OldElement == null) + if (e.NewElement == null) + return; + + if (Control == null) { var entry = new NoCaretField { BorderStyle = UITextBorderStyle.RoundedRect }; @@ -55,13 +59,10 @@ namespace Xamarin.Forms.Platform.iOS SetNativeControl(entry); } - if (e.NewElement != null) - { - UpdateDateFromModel(false); - UpdateMaximumDate(); - UpdateMinimumDate(); - UpdateTextColor(); - } + UpdateDateFromModel(false); + UpdateMaximumDate(); + UpdateMinimumDate(); + UpdateTextColor(); } protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) @@ -120,5 +121,34 @@ namespace Xamarin.Forms.Platform.iOS else Control.TextColor = textColor.ToUIColor(); } + + protected override void Dispose(bool disposing) + { + if (_disposed) + return; + + _disposed = true; + + if (disposing) + { + _defaultTextColor = null; + + if (_picker != null) + { + _picker.RemoveFromSuperview(); + _picker.ValueChanged -= HandleValueChanged; + _picker.Dispose(); + _picker = null; + } + + if (Control != null) + { + Control.EditingDidBegin -= OnStarted; + Control.EditingDidEnd -= OnEnded; + } + } + + base.Dispose(disposing); + } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.iOS/Renderers/PickerRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/PickerRenderer.cs index c0f10d10..0905dcfc 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/PickerRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/PickerRenderer.cs @@ -11,6 +11,7 @@ namespace Xamarin.Forms.Platform.iOS { UIPickerView _picker; UIColor _defaultTextColor; + bool _disposed; IElementController ElementController => Element as IElementController; @@ -139,13 +140,51 @@ namespace Xamarin.Forms.Platform.iOS Control.TextColor = textColor.ToUIColor(); } + protected override void Dispose(bool disposing) + { + if (_disposed) + return; + + _disposed = true; + + if (disposing) + { + _defaultTextColor = null; + + if (_picker != null) + { + if (_picker.Model != null) + { + _picker.Model.Dispose(); + _picker.Model = null; + } + + _picker.RemoveFromSuperview(); + _picker.Dispose(); + _picker = null; + } + + if (Control != null) + { + Control.EditingDidBegin -= OnStarted; + Control.EditingDidEnd -= OnEnded; + } + + if(Element != null) + ((INotifyCollectionChanged)Element.Items).CollectionChanged -= RowsCollectionChanged; + } + + base.Dispose(disposing); + } + class PickerSource : UIPickerViewModel { - readonly PickerRenderer _renderer; + PickerRenderer _renderer; + bool _disposed; - public PickerSource(PickerRenderer model) + public PickerSource(PickerRenderer renderer) { - _renderer = model; + _renderer = renderer; } public int SelectedIndex { get; internal set; } @@ -183,6 +222,19 @@ namespace Xamarin.Forms.Platform.iOS if(_renderer.Element.On<PlatformConfiguration.iOS>().UpdateMode() == UpdateMode.Immediately) _renderer.UpdatePickerFromModel(this); } + + protected override void Dispose(bool disposing) + { + if (_disposed) + return; + + _disposed = true; + + if (disposing) + _renderer = null; + + base.Dispose(disposing); + } } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.iOS/Renderers/TimePickerRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/TimePickerRenderer.cs index f2632768..bfb96d81 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/TimePickerRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/TimePickerRenderer.cs @@ -10,17 +10,34 @@ namespace Xamarin.Forms.Platform.iOS { UIDatePicker _picker; UIColor _defaultTextColor; + bool _disposed; IElementController ElementController => Element as IElementController; protected override void Dispose(bool disposing) { + if (_disposed) + return; + + _disposed = true; + if (disposing) { - Control.EditingDidBegin -= OnStarted; - Control.EditingDidEnd -= OnEnded; + _defaultTextColor = null; - _picker.ValueChanged -= OnValueChanged; + if (_picker != null) + { + _picker.RemoveFromSuperview(); + _picker.ValueChanged -= OnValueChanged; + _picker.Dispose(); + _picker = null; + } + + if (Control != null) + { + Control.EditingDidBegin -= OnStarted; + Control.EditingDidEnd -= OnEnded; + } } base.Dispose(disposing); |