2017-12-07 4 views
0

KVO를 사용하여 코드의 C/C++ 쪽에서 선언 된 포인터를 모니터링하기위한 Objective-C 함수를 만들려고합니다. 이것을 할 수있는 방법이 있습니까?KVO를 사용하여 C 포인터 모니터링

자세히 설명합니다. C 객체 포인터가 있습니다. 그 포인터를 내 다리 기능을 통해 void*으로 코드의 Objective-C 쪽으로 전달합니다.

그것은 KVO을 설정 void*를 패스 다운 사용을 통해 통지 할 수있다 경우 : C 오브젝트 포인터 코드 C의 측면에 의해 수정

-(void)observeValueForKeyPath:(NSString *) keyPath of Object:...

?

답변

0

KVO, 그냥 속성을 관찰하고 자동으로 통지에게이 변화 할 때마다 얻을 수있는 능력으로, 마법처럼 보이지만 정말 모든 애플이 자동으로이에서 귀하의 재산의 세터를 변경할 수 있습니다 :

- (void)setFoo:(Foo *)newFoo { 
    self.foo = newFoo; 
} 

로 이 :

- (void)setFoo:(Foo *)newFoo { 
    [self willChangeValueForKey:@"foo"]; 
    self.foo = newFoo; 
    [self didChangeValueForKey:@"foo"]; 
} 

willdidChangeValueForKey: 방법은 KVO 시스템이 속성에 대한 관찰자를 확인하고있을 경우이를 통지의 원인이 무엇인가. setter의 자동 대체는 Objective-C의 매우 역동적 인 특성을 이용하여 이루어 지므로 런타임에 메서드를 패치하고 변경하는 것이 상대적으로 간단합니다 (KVO 속성을 구현하는 데 dynamic 키워드가 필요한 이유는 Swift에서). 물론 이러한 동적 기능은 C 또는 C++에는 없습니다.

당신이해야 할 일은 C 코드가 2 개의 콜백을 정의하도록하는 것입니다. 하나는 C 코드가 값을 변경하기 전에 호출하고 다른 하나는 나중에 호출합니다. 이 설정을 완료하면 Objective-C 측에서 설정 프로세스의 어딘가에 이러한 콜백을 등록하고 willChangeValueForKey:didChangeValueForKey: 메소드를 콜백으로 호출하게합니다. 이 작업을 완료하면 일반 KVO 방법을 사용하여 속성을 관찰 할 수 있어야합니다.