Я пытаюсь создать JavaScript для собственного общения. Для этого мне нужно динамически выполнять метод в некотором классе, когда его вызывает JavaScript.
У меня проблема с получением возвращаемого значения NSInvocation. Когда используется getReturnValue, приложение вылетает из-за зомби. Указывается, что зомби исходит из возвращаемого значения вызываемого метода.
Если я закомментирую строку [invocation getReturnValue:&result];
, приложение не сломается.
Тестовый метод, который я сейчас вызываю, возвращает результат, и (NSString *)
если я заставляю реализацию вызванного метода селектора возвращать литеральную строку, например @"firstsecond"), приложение также не ломается.
Зачем вообще нужна ссылка на него, когда метод вызова уже выполнен и возвращается строка. Разве возвращаемая строка не копируется в файл id result
.
- (void)userContentController:(nonnull WKUserContentController *)userContentController didReceiveScriptMessage:(nonnull WKScriptMessage *)message {
if ([@"Native_iOS_Handler" isEqualToString: message.name]) {
NSArray *arguments = [message.body valueForKey:@"arguments"];
NSNumber *callbackID = [message.body valueForKey:@"callbackID"];
NSString *APIName = [message.body valueForKey:@"APIName"];
NSString *methodName = [message.body valueForKey:@"methodName"];
id classAPI = [self.exposedAPIs objectForKey:APIName];
SEL methodToRun = [classAPI getSelectorForJSMethod:methodName];
NSMethodSignature *methodSignature = [classAPI methodSignatureForSelector:methodToRun];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
[invocation setTarget:classAPI];
[invocation setSelector:methodToRun];
id result;
[invocation invoke];
[invocation getReturnValue:&result];
NSLog(@"%@", result);// output: firstsecond
}
}
//the selector in this case is this
-(NSString*)getFoo{
// Why is this a zombie????
return [NSString stringWithFormat:@"%@%@", @"first", @"second"];
// This works:
//return @"fristsecond"
}
Хотя селектор в Инструментах отличается, результат тот же. Из этой картины я понимаю, что я сказал вам. У меня нет опыта работы с инструментами.