@@ -158,14 +158,15 @@ - (void)dealloc {
158
158
@implementation DictionaryAdapter {
159
159
IsolateWrapper* wrapper_;
160
160
std::shared_ptr<Persistent<Value>> object_;
161
+ ObjCDataWrapper* dataWrapper_;
161
162
}
162
163
163
164
- (instancetype )initWithJSObject : (Local<Object>)jsObject isolate : (Isolate*)isolate {
164
165
if (self) {
165
166
self->wrapper_ = new IsolateWrapper (isolate);
166
167
self->object_ = std::make_shared<Persistent<Value>>(isolate, jsObject);
167
168
self->wrapper_ ->GetCache ()->Instances .emplace (self, self->object_ );
168
- tns::SetValue (isolate, jsObject, new ObjCDataWrapper (self));
169
+ tns::SetValue (isolate, jsObject, (self-> dataWrapper_ = new ObjCDataWrapper (self) ));
169
170
}
170
171
171
172
return self;
@@ -253,17 +254,25 @@ - (NSEnumerator*)keyEnumerator {
253
254
}
254
255
255
256
- (void )dealloc {
256
- if (wrapper_->IsValid ()) {
257
+ if (wrapper_->IsValid ()) {
257
258
Isolate* isolate = wrapper_->Isolate ();
259
+ v8::Locker locker (isolate);
260
+ Isolate::Scope isolate_scope (isolate);
261
+ HandleScope handle_scope (isolate);
258
262
wrapper_->GetCache ()->Instances .erase (self);
259
263
Local<Value> value = self->object_ ->Get (isolate);
260
264
BaseDataWrapper* wrapper = tns::GetValue (isolate, value);
261
265
if (wrapper != nullptr ) {
266
+ if (wrapper == dataWrapper_) {
267
+ dataWrapper_ = nullptr ;
268
+ }
262
269
tns::DeleteValue (isolate, value);
263
270
delete wrapper;
264
271
}
265
272
}
266
- self->object_ = nil ;
273
+ if (dataWrapper_ != nullptr ) {
274
+ delete dataWrapper_;
275
+ }
267
276
self->object_ = nullptr ;
268
277
delete self->wrapper_ ;
269
278
0 commit comments