2014-04-15 2 views
0

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 *으로 변환하도록 코드를 작성할 수있는 방법이 있습니까? 자바 스크립트 쪽에서 호출을 가로 챌 수 있고 필요한 부분을 수행 할 수 있음을 알았지 만 가능한 경우이를 피하고 싶습니다.

답변

2

여러 유형 중 하나를 선택해야하는 경우 NSObject * 대신 id을 사용해야합니다. 이것은

더 나은 당신이 실제로 전달 된 어떤 종류의 알아낼 도움이 될 수 있습니다 -[JSValue is*] 메시지 때문에 유형으로 JSValue *을 사용할 수 C.

에서 같은 void *의 일반적인 포인터 종류 만들 것입니다. 이것의 단점은 보유주기를 막기 위해 JSValue * 속성을 JSManagedValue * ivars로 백업해야한다는 것입니다. 이 메모리 관리 문제에 대한 자세한 내용은 2/3에 대한 WWDC 2013 비디오 615를 참조하십시오.

+0

우리는 objective-c 객체의 속성으로 JSValue를 사용해서는 안됩니다. 유지 사이클이 발생할 것입니다. 하지만 그는 JSManagedValue를 사용할 수 있습니다. – TechZen

+0

@TechZen JSValue를 속성으로 사용할 수 있습니다. 실제로 비디오는 그렇게합니다. 속성의 유형은 setter가 사용하는 형식이며 getter가 반환하는 형식이며 속성을 저장하는 데 사용되는 ivar 형식이 아닐 수 있습니다. JSManagedValue 유형의 ivars에 액세스하는 JSValue 유형의 특성을 갖는 것은 쉽습니다. 이것은 나의 제안이 목표로 삼은 것입니다. – erm410

+0

아, 그렇습니다. 발을 쏠 수있는 좋은 방법 인 것 같습니다. – TechZen

관련 문제