ObjectiveC и JavaScriptCore: вызовет ли использование этого метода вызова CallBacks проблемы с памятью?

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это длинная статья, но она может оказаться очень полезной для тех, кто борется с использованием новой инфраструктуры ObjectiveC JavascriptCore и выполняет асинхронное кодирование между ObjC и JS.

Привет, я супер новичок в Objective C и интегрирую библиотеку javascript в мое приложение для iOS.

В любом случае, я пробовал свои силы в использовании новой ObjectiveC JavaScriptCore Framework, представленной в iOS7. По большому счету, это довольно круто, хотя до сих пор довольно плохо документировано.

Это действительно странное смешение языковых соглашений, но также и своего рода освобождение.

Я должен добавить, что я, конечно, использую ARC, так что это очень помогает в мире Javascript. Но у меня есть довольно специфический вопрос, касающийся проблем использования памяти при перемещении между ObjectiveC и callBacks JSContext. Например, если я выполняю функцию в Javascript, которая затем выполняет некоторый асинхронный код, а затем вызывает обратно определенный блок ObjectiveC, а затем вызывает определенный обратный вызов JS ... Я просто хочу убедиться, что я делаю это правильно (т.е. не протекает память где-то)!

Просто чтобы сделать вещи правильно (потому что я ссылаюсь на классself для вызова CallBacks Objective C я создаюweakSelf так что хорошо играет с ARC (ссылка на вопрос:сильный захват себя в этом блоке может привести к циклу сохранения):

__unsafe_unretained typeof(self) weakSelf = self;

Теперь скажи, что у меня естьJSContext и добавить функцию к нему. Я хочу, чтобы эта функция принимала функцию callBack и вызывала ее с «Hello» в качестве аргументаа также передать ДРУГУЮ функцию, как callBack, то есть.

// 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.

Итак, у нас есть основная часть JS. Теперь добавим сложность ObjectiveC. Я собираюсь добавить первый блок ObjectiveC CallBack:

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

В том же классе все это происходит у меня также есть определение метода.Это место, которое вызывает у меня наибольшее беспокойство:

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

Поэтому, когда я звоню:

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

Он должен пройти через цепь, и он делает именно то, что я ожидаю.

Моя главная проблема в том, что я надеюсь, что я не каким-то образом собираю JSValue где-нибудь вдоль этой цепочки, которая затем просачивается.

Любая помощь, помогающая мне понять, как ARC / JSMachine будет управлять этим подходом к плавному вызову callBacks между Objective C и Javascript, будет очень ценной!

Кроме того, я надеюсь, что этот вопрос поможет другим, кто экспериментирует с этой структурой.

Спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос