¿Hay alguna manera de mover un JSValue a un nuevo JSContext ignorando su context original?

Tengo dos JSContexts, y quiero intercambiar JSValues ​​entre ellos de vez en cuando. Sin embargo, estoy teniendo dificultades para mover un JSValue a un nuevo context, si es posible.

Estoy probando esto:

newContext[@"newValue"] = [JSValue valueWithObject:newValue inContext:newContext]; 

Si bien el nuevo context ahora tiene ese valor, el valor conserva su antiguo context. Desafortunadamente, todavía conserva su antiguo context. ¿Alguna sugerencia?

Sugiero que extraiga el valor de JSValue de su antiguo context de javascript en un objective ordinario object-c antes de crear el nuevo JSValue en el nuevo context. Al mirar JSValue.h se muestra que la class JSValue tiene una propiedad de solo lectura que contiene el JSContext del que se origina el valor.

No puedo decir con qué tipo de valor se trata desde su código anterior, pero por ejemplo (para types simples):

 NSString *newString = [newValue toString]; // Extract from old JSValue newContext[@"newValue"] = newString; 

o para un object más complejo:

 @protocol MyPointExports <JSExport> @property double x; @property double y; @end @interface MyPoint : NSObject <MyPointExports> // Put methods and properties not visible to JavaScript code here. @end newcontext[@"MyPoint"] = [MyPoint class]; // Define the class in Javascript ... MyPoint *p = [newValue toObject]; // Extract from old JSValue newContext[@"newValue"] = p; 

Tenga en count que el valor seguirá existiendo en el antiguo JSContext (el viejo JSContext permanecerá vivo mientras se conserva el valor anterior). Es posible que desee eliminar esta reference mediante:

 oldContext[@"oldValue"] = nil; // Assuming the var in the oldContext was called oldValue 

Tenga en count también que no necesita usar el constructor:

 + (JSValue *)valueWithObject:(id)value inContext:(JSContext *)context; 

ya que JavaScriptCore tiene una conversión incorporada para lo siguiente (ver JSValue.h):

  Objective-C type | JavaScript type --------------------+--------------------- nil | undefined NSNull | null NSString | string NSNumber | number, boolean NSDictionary | Object object NSArray | Array object NSDate | Date object NSBlock * | Function object * id ** | Wrapper object ** Class *** | Constructor object *** * Instances of NSBlock with supported arguments types will be presented to JavaScript as a callable Function object. For more information on supported argument types see JSExport.h. If a JavaScript Function originating from an Objective-C block is converted back to an Objective-C object the block will be returned. All other JavaScript functions will be converted in the same manner as a JavaScript object of type Object. ** For Objective-C instances that do not derive from the set of types listed above, a wrapper object to provide a retaining handle to the Objective-C instance from JavaScript. For more information on these wrapper objects, see JSExport.h. When a JavaScript wrapper object is converted back to Objective-C the Objective-C instance being retained by the wrapper is returned. *** For Objective-C Class objects a constructor object containing exported class methods will be returned. See JSExport.h for more information on constructor objects. 

En realidad, no necesita preocuparse por el context en JSValue, si coloca un punto de interrupción en el código javascript, puede ver que el object pasado de Native no tiene una propiedad de context. El context en JSValue es solo para mostrar el JSContext original y no se vincula realmente con él.