ObjectiveC y JavaScriptCore: ¿El uso de este método para llamar a CallBacks causará problemas de memoria?

DESCARGO DE RESPONSABILIDAD: Este es un post largo, pero podría ser muy valioso para aquellos que lidian con el uso del nuevo marco ObjectiveC JavascriptCore y con la codificación asíncrona entre ObjC y JS.

Hola, soy súper nuevo en Objective C y estoy integrando una biblioteca de comunicación javascript en mi aplicación iOS.

De todos modos, he estado intentando usar el nuevo Framework ObjectiveC JavaScriptCore Framework introducido en iOS7. Es bastante impresionante en su mayor parte, aunque bastante mal documentado hasta ahora.

Es realmente extraño mezclar convenciones lingüísticas, pero también algo liberador en algunos aspectos.

Debo agregar que, por supuesto, estoy usando ARC, por lo que ayuda mucho el mundo de Javascript. Pero tengo una pregunta que es bastante específica acerca de los problemas de uso de la memoria cuando se mueve entre ObjectiveC y los CallBacks de JSContext. Al igual que si ejecuto una función en Javascript que hace un código asíncrono, y luego vuelve a llamar a un bloque de ObjectiveC definido, y luego llama a una devolución de llamada JS definida ... Solo quiero asegurarme de que lo estoy haciendo bien (es decir, . No se está perdiendo la memoria en algún lugar)!

Solo para hacer las cosas bien (porque me refiero a la claseself para llamar a los ObjectBack CallBacks creo unaweakSelf así que se juega bien con ARC (referenciado desde la pregunta)capturarse fuertemente en este bloque es probable que conduzca a un ciclo de retención):

__unsafe_unretained typeof(self) weakSelf = self;

Ahora, di que tengo unJSContext y añadirle una función. Quiero que esta función tome una función callBack y la llame con "Hola" como argumentoasí como pasar otra función como callback. es decir.

// Add a new JSContext.
JSContext context = [[JSContext alloc] initWithVirtualMachine:[[JSVirtualMachine alloc] init]];

// Add a function to the context. This function takes a callBack function and calls it back with "Hello"
[context evaluateScript: @"var functionA = function(callBack){
      var aMessage = "Foo";
      callBack(aMessage, function(message){
            /* message should say: Foo Bar */
      });
}" ];
// Note, if you try to copy this code, you will have to get rid of the returns in the JS script.

Bien, entonces tenemos nuestro lado básico de JS de las cosas. Ahora para agregar la complejidad de ObjectiveC. Voy a agregar el primer bloque de CallBack de ObjectiveC:

context[@"functionB"] = ^(NSString *theMessage, JSValue *theCallBack){
    [weakSelf objCFunction:theMessage withCallBack:theCallBack];
};

En la misma clase, todo esto está sucediendo, también tengo la definición del método.Este es el lugar que más me preocupa.:

-(void)objCFunction:(NSString *)message withCallBack:(JSValue *)callBack
{
    NSString *concatenatedString = [NSString stringWithFormat:@"%@%@", message, @"Bar"];
    [callBack callWithArguments:@[concatenatedString]];
}

Así que cuando llamo:

[context evaluateScript: @"functionA(functionB);" ];

Debería pasar a través de la cadena, y hace exactamente lo que yo espero que haga.

Mi principal preocupación es que espero que de alguna manera no esté capturando un JSValue en algún lugar a lo largo de esta cadena que luego se esté filtrando.

Cualquier ayuda para ayudarme a entender cómo ARC / JSMachine manejaría este enfoque para llamar a CallBacks de manera fluida entre Objective C y Javascript, ¡sería súper valiosa!

Además, espero que esta pregunta ayude a otros que están experimentando con este marco.

¡Gracias!

Respuestas a la pregunta(2)

Su respuesta a la pregunta