【发布时间】:2014-04-15 19:28:53
【问题描述】:
考虑以下带有 NSObject * 属性的 JSExported Objective-c 类:
@protocol MyObjectExport <JSExport>
@property (nonatomic, strong) NSObject *myProperty;
@end
@interface MyObject : NSObject <MyObjectExport>
@end
@implementation MyObject
- (NSObject *)myProperty
{
NSLog(@"in myProperty");
return nullptr;
}
- (void)setMyProperty:(NSObject *)myProperty
{
NSLog(@"in setMyProperty");
}
@end
如果我执行这段代码:
{
JSContext *context = [[JSContext alloc] init];
context[@"myObject"] = [[MyObject alloc] init];
[context evaluateScript:@"var foo = myObject.myProperty; myObject.myProperty = foo;"];
}
myProperty 和 setMyProperty 都被调用。
但是如果我执行这段代码:
{
JSContext *context = [[JSContext alloc] init];
context[@"myObject"] = [[MyObject alloc] init];
[context evaluateScript:@"myObject.myProperty = \"foo\";"];
}
setMyProperty 没有被调用,大概是因为 "foo" 与 NSObject * 不兼容。
但是,如果我执行这段代码:
{
MyObject *myObject = [[MyObject alloc] init];
myObject.myProperty = @"foo";
}
setMyProperty 被调用。
当然,如果我用 NSString * 替换 NSObject *,一切正常。但我需要这个属性才能容纳各种对象类型。
我不控制传递给 evaluateScript 的内容。但是,有没有一种方法可以编写代码,以便 JavaScriptCore 在将“foo”传递给 Objective-c 回调之前将其普遍转换为 NSString *?我意识到我可以在 javascript 端拦截调用并在那里进行必要的摆弄,但如果可能的话,我想避免这种情况。
【问题讨论】:
标签: javascript ios javascriptcore