gpt4 book ai didi

JavaScriptCore 不会将字符串作为 NSObject *

转载 作者:行者123 更新时间:2023-11-28 22:10:16 40 4
gpt4 key购买 nike

考虑以下带有 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 端拦截调用并在那里进行必要的摆弄,但我想尽可能避免这种情况。

最佳答案

如果您需要持有多种类型中的一种,您应该使用 id 而不是 NSObject *。这将使它成为一种通用指针,类似于 C 中的 void *

更好的是,您可以使用 JSValue * 作为类型,因为 -[JSValue is*] 消息可以帮助您确定实际传递的类型。不过,这样做的缺点是您的 JSValue * 属性需要由 JSManagedValue * ivars 支持,以防止循环保留。有关此内存管理问题的更多信息,请参阅 WWDC 2013 视频 615,大约完成了 2/3。

关于JavaScriptCore 不会将字符串作为 NSObject *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23092717/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com