@@ -19,15 +19,16 @@ const defaultAssetCollectionSubtypes: NSArray<any> = NSArray.arrayWithArray(<any
19
19
20
20
export class ImagePicker extends data_observable . Observable {
21
21
_imagePickerController : QBImagePickerController ;
22
- _imagePickerControllerDelegate : ImagePickerControllerDelegate ;
23
22
_hostView : View ;
24
23
25
24
// lazy-load latest frame.topmost() if _hostName is not used
26
25
get hostView ( ) {
27
26
return this . _hostView ;
28
27
}
29
28
30
- get hostController ( ) {
29
+
30
+
31
+ get hostController ( ) : UIViewController {
31
32
let vc = this . hostView ? this . hostView . viewController : UIApplication . sharedApplication . keyWindow . rootViewController ;
32
33
while (
33
34
vc . presentedViewController
@@ -43,9 +44,9 @@ export class ImagePicker extends data_observable.Observable {
43
44
super ( ) ;
44
45
45
46
this . _hostView = hostView ;
46
- this . _imagePickerControllerDelegate = ImagePickerControllerDelegate . new ( ) ;
47
47
48
48
let imagePickerController = QBImagePickerController . alloc ( ) . init ( ) ;
49
+
49
50
imagePickerController . assetCollectionSubtypes = defaultAssetCollectionSubtypes ;
50
51
imagePickerController . mediaType = options . mediaType ? < QBImagePickerMediaType > options . mediaType . valueOf ( ) : QBImagePickerMediaType . Any ;
51
52
imagePickerController . allowsMultipleSelection = options . mode !== 'single' ;
@@ -76,12 +77,13 @@ export class ImagePicker extends data_observable.Observable {
76
77
77
78
present ( ) {
78
79
return new Promise < void > ( ( resolve , reject ) => {
79
- this . _imagePickerControllerDelegate . _resolve = resolve ;
80
- this . _imagePickerControllerDelegate . _reject = reject ;
80
+ const imagePickerControllerDelegate = ImagePickerControllerDelegate . new ( ) ;
81
+ imagePickerControllerDelegate . _resolve = resolve ;
82
+ imagePickerControllerDelegate . _reject = reject ;
83
+
84
+ this . _imagePickerController . delegate = imagePickerControllerDelegate ;
81
85
82
- this . hostController . presentViewControllerAnimatedCompletion ( this . _imagePickerController , true , ( ) => {
83
- this . _imagePickerController . delegate = this . _imagePickerControllerDelegate ;
84
- } ) ;
86
+ this . hostController . presentViewControllerAnimatedCompletion ( this . _imagePickerController , true , null ) ;
85
87
} ) ;
86
88
}
87
89
}
@@ -93,6 +95,8 @@ export class ImagePickerControllerDelegate extends NSObject implements QBImagePi
93
95
qb_imagePickerControllerDidCancel ?( imagePickerController : QBImagePickerController ) : void {
94
96
imagePickerController . dismissViewControllerAnimatedCompletion ( true , null ) ;
95
97
this . _reject ( new Error ( "Selection canceled." ) ) ;
98
+
99
+ this . deRegisterFromGlobal ( ) ;
96
100
}
97
101
98
102
qb_imagePickerControllerDidFinishPickingAssets ?( imagePickerController : QBImagePickerController , iosAssets : NSArray < any > ) : void {
@@ -112,6 +116,7 @@ export class ImagePickerControllerDelegate extends NSObject implements QBImagePi
112
116
this . _resolve ( assets ) ;
113
117
114
118
imagePickerController . dismissViewControllerAnimatedCompletion ( true , ( ) => {
119
+ this . deRegisterFromGlobal ( ) ;
115
120
// FIX: possible memory issue when picking images many times.
116
121
// Not the best solution, but the only one working for now
117
122
// https://github.com/NativeScript/nativescript-imagepicker/issues/222
@@ -120,10 +125,24 @@ export class ImagePickerControllerDelegate extends NSObject implements QBImagePi
120
125
121
126
}
122
127
123
- public static ObjCProtocols = [ QBImagePickerControllerDelegate ] ;
128
+ // FIX: stores a reference to global scope, so that the delegate is not collected in native
129
+ // https://github.com/NativeScript/nativescript-imagepicker/issues/251
130
+ private registerToGlobal ( ) : any {
131
+ ( < any > global ) . imagePickerControllerDelegate = this ;
132
+ }
133
+
134
+ private deRegisterFromGlobal ( ) : any {
135
+ ( < any > global ) . imagePickerControllerDelegate = null ;
136
+ }
124
137
138
+ public static ObjCProtocols = [ QBImagePickerControllerDelegate ] ;
139
+
125
140
static new ( ) : ImagePickerControllerDelegate {
126
- return < ImagePickerControllerDelegate > super . new ( ) ; // calls new() on the NSObject
141
+ const instance = < ImagePickerControllerDelegate > super . new ( ) ; // calls new() on the NSObject
142
+
143
+ instance . registerToGlobal ( ) ;
144
+
145
+ return instance ;
127
146
}
128
147
}
129
148
0 commit comments