NSObject의 * 속성을 다음 JSExported 목표 - C 클래스 고려 :JavaScriptCore는이 NSObject의로 문자열을 전달하지 않음 *
{
JSContext *context = [[JSContext alloc] init];
context[@"myObject"] = [[MyObject alloc] init];
[context evaluateScript:@"var foo = myObject.myProperty; myObject.myProperty = foo;"];
}
myProperty 및 setMyProperty 모두 :
@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:@"myObject.myProperty = \"foo\";"];
}
setMyProperty가 호출되지 않습니다, 아마도 때문에 "푸"* NSObject의와 호환되지 않습니다.
그러나, 나는이 코드를 실행하면 :
{
MyObject *myObject = [[MyObject alloc] init];
myObject.myProperty = @"foo";
}
setMyProperty가 호출됩니다.
물론 NSObject *를 NSString *으로 대체하면 모든 것이 잘 동작합니다. 하지만 다양한 객체 유형을 보유 할 수 있으려면이 속성이 필요합니다.
나는 evaluateScript로 전달되는 것을 제어하지 않습니다. 그러나 JavaScriptCore가 objective-c 콜백에 전달하기 전에 "foo"를 NSString *으로 변환하도록 코드를 작성할 수있는 방법이 있습니까? 자바 스크립트 쪽에서 호출을 가로 챌 수 있고 필요한 부분을 수행 할 수 있음을 알았지 만 가능한 경우이를 피하고 싶습니다.
우리는 objective-c 객체의 속성으로 JSValue를 사용해서는 안됩니다. 유지 사이클이 발생할 것입니다. 하지만 그는 JSManagedValue를 사용할 수 있습니다. – TechZen
@TechZen JSValue를 속성으로 사용할 수 있습니다. 실제로 비디오는 그렇게합니다. 속성의 유형은 setter가 사용하는 형식이며 getter가 반환하는 형식이며 속성을 저장하는 데 사용되는 ivar 형식이 아닐 수 있습니다. JSManagedValue 유형의 ivars에 액세스하는 JSValue 유형의 특성을 갖는 것은 쉽습니다. 이것은 나의 제안이 목표로 삼은 것입니다. – erm410
아, 그렇습니다. 발을 쏠 수있는 좋은 방법 인 것 같습니다. – TechZen