2012-06-13 2 views
3

Objective-C 개체 속성을 서로 바인딩하고 싶지만 속성은 C++ 클래스입니다. 이 속성은 실제로 수학적 벡터 클래스이며, 연산자 오버로드가 벡터 수학에 유용하기 때문에 작업하기가 더 쉽습니다. (객관적인 C 객체로 벡터 수학을 사용하는 것도 좋은 방법입니다.)objective-c에서 C++ 객체를 속성으로 바인딩하는 방법은 무엇입니까?

문제는이 벡터 속성을 바인딩하면 응용 프로그램이 충돌한다는 것입니다. 여기 은 예입니다

@interface M_Node : NSObject{ 
Vec3f pos; 
M_Node *manipulator 
} 
@property Vec3f pos; 
@end 

@implementation 
@synthesize pos; 

@dynamic pos; 
-(void)setPos:(Vec3f)newPos{ 
pos=Vec3f(newPos); 
} 
-(Vec3f)pos{ 
return Vec3f(pos); 
} 

- (id) init 
{ 
self = [super init]; 
if (self != nil) { 
[self bind:@"pos" toObject:self withKeyPath:@"manipulator.pos" options:nil]; 
} 

return self; 
} 

엑스 코드로 문제 형식 'Vec3f'(일명 'VEC3') 합성 세터 사용 사소하지 않은 할당 연산자

의 원자 재산 내가에서 Vec3f 클래스를 사용 cinder : http://libcinder.org/docs/v0.8.3/classcinder_1_1_vec3.html

그래서 문제는 objective-c에서 C++ 객체를 속성으로 바인딩하는 것입니까, 아니면 가능합니까? 다른 방법이 있습니까? (경우 어떻게 목표 - C 깨끗한 벡터, 행렬 등 수학을 수행하는 방법 알려 주시기 바랍니다 어떤 생각을 가지고있다.)

이 내가 설명서에있는 것입니다 :의

KVC 변환 스칼라 및 구조 값 KVC 메서드 valueForKey : 및 setValue : forKey :의 기본 구현은 BOOL, char, double, float, int 및 NSPoint, NSRange 및 같은 구조체와 같은 스칼라 데이터 형식의 자동 개체 래핑을 지원합니다. 및 NSRect. Cocoa 스크립팅이 valueForKey :를 호출하여 값을 얻으면 KVC는 필요에 따라 값을 NSNumber 객체 (스칼라의 경우) 또는 NSValue 객체 (구조의 경우)로 자동 변환합니다. 마찬가지로 setValue : forKey :는 지정된 접근 자나 인스턴스 변수가 지정한 키에 필요한 데이터 유형을 결정합니다. 데이터 유형이 오브젝트가 아니면 값은 적절한 NSNumber orNSValue 메소드를 사용하여 전달 된 오브젝트에서 추출됩니다. 지원되는 형식의 테이블을 비롯한 자세한 내용은 키 값 코딩의 스칼라 및 구조 지원 프로그래밍 가이드

여전히 NSRect와 같은 구조체에 대한 래퍼가 있습니다. 원래 valueForKey :를 재정의하는 방법이있을 수 있으므로 Vec3f도 처리 할 수 ​​있습니다. 및 의 setValue : forKey : 그래서 내 자신의 C 객체 ++ 처리 할 수있을 것 가 어떻게 valueForKey를 오버라이드 (override) :

그래서이 새 질문 있을까?

+0

이니셜 라이저에서 [self bind : etc ... if (self! = nil) 블록 안에 넣으려고 했습니까? 블록 외부의 어떤 것이라도 자기가 무효가 될 수 있고 컴파일러가 쫓아 낼 수 있음을 의미합니다. – Patrick

+0

실제로 입력 오류였습니다. 원본은 if 블록 안에 있습니다. 심지어 두 개의 완전히 다른 개체를 외부에서 바인딩하려고했습니다. 그리고 그것은 여전히 ​​충돌합니다. – zalavari

+0

직접 세터를 구현해 보셨습니까? – zneak

답변

1

매우 성공적일까요?

바인딩은 키 값 코딩 (KVC) 및 키 값 관찰 (KVO)을 기반으로합니다. 키 경로가 manipulator.pos입니다. 즉 manipulator 속성은 pos 속성에 대해 KVC 및 KVO 규격 인 Objective-C 개체 여야합니다. 명확하지 않지만 M_Node은 Objective-C 클래스가 아닌 C++ 클래스이며 따라서 KVC 또는 KVO와 호환되지 않습니다.

다음은 KVC가 반환 할 수있는 경우 pos의 값을 전달하는 방법에 대한 질문입니다. KVC는 비 객체 데이터 유형을 NSNumber 또는 NSValue으로 묶어 전달합니다. 그러나 Vec3f이 POD가 아닌 경우 제대로 작동하지 않을지 의심 스럽습니다.

궁극적으로 바인딩은 마술이 아닙니다 (비록 KVO의 구현에는 거의 마법 같은 것이 있습니다). 요점은, 당신은 [[yourObject valueForKey:@"manipulator"] valueForKey:@"pos"]가 작동 할 것이라고 기대합니까? [[yourObject valueForKey:@"manipulator"] setValue:someValue forKey:@"pos"]을 (를) 사용 하시겠습니까? 그렇지 않으면 바인딩이 작동하지 않습니다.

+0

글쎄요, 당신이 요점을 만들었다 고 생각합니다. – zalavari

+0

나는 작동 할 수있는 방법을 발견했습니다. (사실 stackoverflow는 아직 내 질문에 답할 수 없기 때문에 맨 위로 업데이트 할 것이다.) – zalavari

+0

나는 당신이 가진 생각에 대해서 언급했지만,기도하기 위해서 Vec3f는 [ POD (일반 오래된 데이터)] (http://www.parashift.com/c++-faq-lite/intrinsic-types.html#faq-26.7). –

관련 문제