2011-01-26 3 views
0

저는 최근에 몇 달 전에 나온 코코아 프로젝트에서 최근에 작업을 재개했습니다. 코코아는 잠시 동안 사용하지 않으면 이상한 짐승입니다. 에 대한 'MyClass에'
방법 정의 클래스의경고 : MyClass : NSObject는 키 값 관측을 구현하지 않습니까? 어떻게 그렇게 될수 있니?

불완전한 구현 :

어쨌든, 어떤 점에서 컴파일러는 떨어지고 경고를 시작한 'forKeyPath : 옵션 : -addObserver 컨텍스트'
방법의 정의를 찾을 수 없음 '-removeObserver : forKeyPath :'완전히 'MyZoomScrollViewDataSource'를 구현하지 않습니다
클래스 'MyClass에'를 찾을 수없는 프로토콜

그러나 MyClassNSObject에서 파생되었으며 실제로는 -addObserver:forKeyPath:-removeObserver:forKeyPath:context:을 구현합니다.

프로토콜은 다음과 같습니다

@protocol MyZoomScrollViewDataSource 
    // The range of Data that should be shown. This corresponds to the horizontal 
    // zoom and the scroll value of self. 
    @property FRange selectionRange; 

    // Also, make sure the dataSource is KVO compliant 
    - (void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context; 
    - (void)removeObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath; 
@end 

클래스는 다음과 같습니다

@interface MyClass : NSObject <MyZoomScrollViewDataSource> { 
    IBOutlet Outlets... 
    variables... 
} 
@properties... 
(IBAction)actions... 
- methods... 
@end 

내가 내 코코아 기술을 새로 고침에 대한 깊은 필요로하는 것 같아요. 그러나 여전히 이러한 메서드는 NSObject에서 상속되어야하므로 MyClass은 이러한 메서드를 구현하지 못합니다.

+0

'MyClass'는'NovaController'와 같은가요? –

+0

@Bavarious : 예, 그렇습니다. 그에 따라 문제를 해결했습니다. – bastibe

답변

1

이러한 가능한 해결책 중 하나는 해당 기능을 클래스에 명시 적으로 추가하는 것입니다. 이것은 나에게 오히려 hackish 보인다. 나는 기꺼이 이것을하는 더 깨끗한 방법을 사용합니다.

@implementation MyClass 

- (void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context { 
    [super addObserver:anObserver forKeyPath:keyPath options:options context:context]; 
} 

- (void)removeObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath { 
    [super removeObserver:anObserver forKeyPath:keyPath]; 
} 

@end 

이상한 점은 다음과 같습니다이 너무뿐만 아니라 super과 함께, 그것은 self와 함께 작동 작품! 내 마음이 날아 갔다고 생각해. 이런 젠장?

+0

그것은 컴파일된다는 의미에서 작동하거나 실행된다는 의미에서 작동합니까? 그건 내게 비친 루프 같아. –

+0

그것은 차질없이 달립니다! 그것은 나에게도 루프처럼 보입니다. 코코아, 너 무슨 예술이야? – bastibe

0

사실 나는 내 대답이 성급했습니다.

왜 프로토콜에서 KVO 메서드를 선언하고 있습니까? NSObject는 이미 기본 버전을 구현하고 있습니까?

+0

나는'DataSource'에서이 메소드들을 사용합니다. 만약 내가 선언하지 않는다면, 경고 : 'removeObserver : forKeyPath :'프로토콜에서 찾을 수 없습니다. '를 사용합니다. – bastibe

+0

'DataSource'라고 할 때'NovaController' 클래스를 의미합니까? – Abizern

+0

맞습니다. 그에 따라 문제를 해결했습니다. 지금까지는별로 감각이 없었습니다. – bastibe

3

답변은 질문에 있습니다!

컴파일러 경고 :

-addObserver:forKeyPath: 
-removeObserver:forKeyPath:options:context: 

프로토콜 :

-addObserver:forKeyPath:options:context: 
-removeObserver:forKeyPath: 

두 번째는 더 나은 보인다.

+0

오, 내 잘못이야. 그 질문에 오타가있었습니다. 나는 그 문제를 바로 잡았다. – bastibe

2

당신은 -Wno-protocol 컴파일러 옵션을 사용하여 이러한 경고를 방지 할 수 있어야한다 : 클래스가 프로토콜을 구현하기 위해 선언 된 경우, 경고가 구현되지 않은 프로토콜의 모든 방법을 위해 발행

클래스. 기본 동작은 메소드 구현이 수퍼 클래스에서 상속 된 경우에도 클래스에 명시 적으로 구현되지 않은 모든 메소드, 즉 에 대한 경고를 발행하는 것입니다.-Wno-protocol 옵션을 사용하면 수퍼 클래스에서 상속 된 메서드가 구현 된 것으로 간주되며 이에 대한 경고는 발생하지 않습니다.

+0

그렇다면 공식적으로 수퍼 클래스에서 상속 된 메서드를 사용하지 않는 것이 좋습니다. – bastibe

+0

@BastiBechtold 반드시 그렇지는 않습니다. 나는 컴파일러가 (지나치게) 보수적 인 것으로 생각한다. 왜냐하면 주어진 프로토콜에 대해 서브 클래스가 프로토콜 메소드를 구현해야 할 수도 있기 때문이다. 또는 어쩌면 클래스가 (수퍼 클래스에 상관없이) 클래스가 채택하는 프로토콜에 필수 메소드를 구현해야한다고 생각할 수도 있습니다. –