Skip to content

Commit 942b3b2

Browse files
authored
Merge pull request #256 from NativeScript/tbozhikov/fix-early-delegate-collection
fix: register delegate in global scope on creation, clear it when dismissed
2 parents a16d2f7 + 0cb8bc4 commit 942b3b2

File tree

1 file changed

+26
-9
lines changed

1 file changed

+26
-9
lines changed

src/imagepicker.ios.ts

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,14 @@ const defaultAssetCollectionSubtypes: NSArray<any> = NSArray.arrayWithArray(<any
1919

2020
export class ImagePicker extends data_observable.Observable {
2121
_imagePickerController: QBImagePickerController;
22-
_imagePickerControllerDelegate: ImagePickerControllerDelegate;
2322
_hostView: View;
2423

2524
// lazy-load latest frame.topmost() if _hostName is not used
2625
get hostView() {
2726
return this._hostView;
2827
}
2928

30-
get hostController() {
29+
get hostController(): UIViewController {
3130
let vc = this.hostView ? this.hostView.viewController : UIApplication.sharedApplication.keyWindow.rootViewController;
3231
while (
3332
vc.presentedViewController
@@ -43,9 +42,9 @@ export class ImagePicker extends data_observable.Observable {
4342
super();
4443

4544
this._hostView = hostView;
46-
this._imagePickerControllerDelegate = ImagePickerControllerDelegate.new();
4745

4846
let imagePickerController = QBImagePickerController.alloc().init();
47+
4948
imagePickerController.assetCollectionSubtypes = defaultAssetCollectionSubtypes;
5049
imagePickerController.mediaType = options.mediaType ? <QBImagePickerMediaType>options.mediaType.valueOf() : QBImagePickerMediaType.Any;
5150
imagePickerController.allowsMultipleSelection = options.mode !== 'single';
@@ -76,12 +75,13 @@ export class ImagePicker extends data_observable.Observable {
7675

7776
present() {
7877
return new Promise<void>((resolve, reject) => {
79-
this._imagePickerControllerDelegate._resolve = resolve;
80-
this._imagePickerControllerDelegate._reject = reject;
78+
const imagePickerControllerDelegate = ImagePickerControllerDelegate.new();
79+
imagePickerControllerDelegate._resolve = resolve;
80+
imagePickerControllerDelegate._reject = reject;
8181

82-
this.hostController.presentViewControllerAnimatedCompletion(this._imagePickerController, true, () => {
83-
this._imagePickerController.delegate = this._imagePickerControllerDelegate;
84-
});
82+
this._imagePickerController.delegate = imagePickerControllerDelegate;
83+
84+
this.hostController.presentViewControllerAnimatedCompletion(this._imagePickerController, true, null);
8585
});
8686
}
8787
}
@@ -93,6 +93,8 @@ export class ImagePickerControllerDelegate extends NSObject implements QBImagePi
9393
qb_imagePickerControllerDidCancel?(imagePickerController: QBImagePickerController): void {
9494
imagePickerController.dismissViewControllerAnimatedCompletion(true, null);
9595
this._reject(new Error("Selection canceled."));
96+
97+
this.deRegisterFromGlobal();
9698
}
9799

98100
qb_imagePickerControllerDidFinishPickingAssets?(imagePickerController: QBImagePickerController, iosAssets: NSArray<any>): void {
@@ -112,6 +114,7 @@ export class ImagePickerControllerDelegate extends NSObject implements QBImagePi
112114
this._resolve(assets);
113115

114116
imagePickerController.dismissViewControllerAnimatedCompletion(true, () => {
117+
this.deRegisterFromGlobal();
115118
// FIX: possible memory issue when picking images many times.
116119
// Not the best solution, but the only one working for now
117120
// https://github.com/NativeScript/nativescript-imagepicker/issues/222
@@ -120,10 +123,24 @@ export class ImagePickerControllerDelegate extends NSObject implements QBImagePi
120123

121124
}
122125

126+
// FIX: stores a reference to global scope, so that the delegate is not collected in native
127+
// https://github.com/NativeScript/nativescript-imagepicker/issues/251
128+
private registerToGlobal(): any {
129+
(<any>global).imagePickerControllerDelegate = this;
130+
}
131+
132+
private deRegisterFromGlobal(): any {
133+
(<any>global).imagePickerControllerDelegate = null;
134+
}
135+
123136
public static ObjCProtocols = [QBImagePickerControllerDelegate];
124137

125138
static new(): ImagePickerControllerDelegate {
126-
return <ImagePickerControllerDelegate>super.new(); // calls new() on the NSObject
139+
const instance = <ImagePickerControllerDelegate>super.new(); // calls new() on the NSObject
140+
141+
instance.registerToGlobal();
142+
143+
return instance;
127144
}
128145
}
129146

0 commit comments

Comments
 (0)