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, будет очень ценной!
Кроме того, я надеюсь, что этот вопрос поможет другим, кто экспериментирует с этой структурой.
Спасибо!