面试题答案
一键面试核心代码逻辑
- 导入框架
在Objective-C项目中,首先需要导入
JavaScriptCore
框架:
#import <JavaScriptCore/JavaScriptCore.h>
- 创建上下文并加载JavaScript代码
JSContext *context = [[JSContext alloc] init];
NSString *jsCode = @""; // 这里填入包含目标函数的JavaScript代码
[context evaluateScript:jsCode];
- 调用JavaScript函数
假设JavaScript函数名为
complexFunction
,调用该函数并传入参数:
JSValue *function = context[@"complexFunction"];
NSNumber *numberParam = @123;
NSString *stringParam = @"Hello";
NSDictionary *objectParam = @{@"key": @"value"};
JSValue *result = [function callWithArguments:@[numberParam, stringParam, objectParam]];
- 处理返回的复杂对象 如果返回的是数组或字典嵌套的对象,可以这样处理:
if ([result isArray]) {
NSArray *arrayResult = [result toArray];
// 处理数组结果
} else if ([result isObject]) {
NSDictionary *dictResult = [result toDictionary];
// 处理字典结果
}
可能遇到的问题及解决方案
- JavaScript代码加载失败
- 问题:JavaScript代码中存在语法错误等导致
evaluateScript:
方法返回nil
。 - 解决方案:仔细检查JavaScript代码,在开发阶段可以在JavaScript代码中添加
console.log
输出调试信息,Objective-C中通过context.exception
获取异常信息。
- 问题:JavaScript代码中存在语法错误等导致
JSValue *result = [context evaluateScript:jsCode];
if (context.exception) {
NSLog(@"JavaScript error: %@", context.exception);
}
- 类型转换问题
- 问题:JavaScript和Objective-C的数据类型不完全一致,例如JavaScript的
null
在Objective-C中需要特殊处理。 - 解决方案:在获取返回值后,通过
isObject
、isArray
等方法判断类型,并使用toArray
、toDictionary
等方法进行转换。对于null
值,JSValue
会转换为nil
,可以正常处理。
- 问题:JavaScript和Objective-C的数据类型不完全一致,例如JavaScript的
- 函数未定义
- 问题:调用的JavaScript函数名错误或者函数在加载的代码中未定义。
- 解决方案:仔细检查函数名,确保JavaScript代码加载成功且函数已正确定义。可以在JavaScript代码中添加全局变量来验证函数是否存在,例如:
var functionExists = typeof complexFunction!== 'undefined';
在Objective-C中获取该变量值判断:
JSValue *exists = context[@"functionExists"];
if (![exists toBool]) {
NSLog(@"Function not defined");
}