2009-10-08 4 views
0

아래 코드를 컴파일하면 다음 경고 메시지가 나타납니다. "ITunesFinder *"예상 "id"를 보내는 호환되지 않는 유형? 나는 단지 시작하고 진실한이 예제로 조금 혼란스러워합니다. 위임 클래스를 사용하지 않고이 예제를 작성하는 방법이 있는지 알고 싶습니다.ITunesFinder 예제의 경고 (Apress - Obj-C 학습)

나는 또한 클래스 구현에 대해 다소 혼란 스럽다.이 책은 이것이 무엇을 기반으로하는지, 카테고리, 프로토콜 또는 위임자가하는 일과 그 작동 방식을 설명하지 않는다. 여기

은 ...

// INTERFACE 
#import <Cocoa/Cocoa.h> 
@interface ITunesFinder : NSObject 
@end 

코드입니다.

// IMPLEMENTATION 
#import "ITunesFinder.h" 
@implementation ITunesFinder 
-(void) netServiceBrowser: (NSNetServiceBrowser *) b 
      didFindService: (NSNetService *) service 
       moreComing: (BOOL) moreComing { 

    [service resolveWithTimeout:10]; 
    NSLog(@"Service Found: %@", [service name]); 
} 

-(void) netServiceBrowser: (NSNetServiceBrowser *) b 
     didRemoveService: (NSNetService *) service 
       moreComing: (BOOL) moreComing { 
    [service resolveWithTimeout:10]; 
    NSLog(@"Service Lost!: %@", [service name]); 
} 
@end 

.

// MAIN 
#import <Foundation/Foundation.h> 
#import "ITunesFinder.h" 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    NSNetServiceBrowser *browser = [[NSNetServiceBrowser alloc] init]; 
    ITunesFinder *finder = [[ITunesFinder alloc] init]; 

    NSLog(@"iTunesFinder ... Start"); 
    [browser setDelegate: finder]; // <<< Warning here !!!! 
    [browser searchForServicesOfType: @"_daap._tcp" inDomain:@"local."]; 
    NSLog(@"Browsing ..."); 

    [[NSRunLoop currentRunLoop] run]; 

    // Clean up 
    [browser release]; 
    [finder release]; 
    [pool drain]; 
    return 0; 
} 

모든 지혜/지혜가 크게 감사 할 것입니다.

게리

답변

4

내가 gcc 4.2.1와 10.6에 따라 본을 컴파일하려 할 때, 다음과 같은 경고 컴파일 :

main.m:12: warning: class 'ITunesFinder' does not implement the 'NSNetServiceBrowserDelegate' protocol 

나는 이것이 당신이 설명하는 동일한 문제이지만, 더 자세한 설명 진단오고 의심 컴파일러 (아마 당신보다 최신 버전 일까?). 당신은 헤더의 인터페이스 선언에 프로토콜을 추가하여이 경고를 해결 할 수 있습니다

@interface ITunesFinder : NSObject<NSNetServiceBrowserDelegate> 

경고가 발행 된 이유는 setDelegate: 방법은 다음과 같은 서명을 가지고 있다는 것입니다 :

- (void)setDelegate:(id <NSNetServiceBrowserDelegate>)delegate; 

단순히 수단을 공식적인 NSNetServiceBrowserDelegate 프로토콜을 구현하는 모든 객체를 사용할 수 있습니다. 클래스 인터페이스가이를 명시 적으로 선언하지 않았기 때문에 컴파일러는 사실을 경고합니다. 대리자 메시지가 실제로 전송 될 때 실제 메서드가 제공되면 런타임에서도 작동해야합니다.

위임 클래스를 사용하지 않고이 예제를 작성할 수 있습니까?

아니요, 위임 클래스는 이벤트 알림을 수신하는 방식입니다.

나는이 책이의 기반, 또는 무엇을 설명하지 않습니다 클래스 구현에 의해 조금 혼란도 오전 카테고리, 프로토콜 또는 대리인이 무슨 문제가 없으며, 그들이 어떻게 작동합니다.

NSNetServiceBrowserDelegate 프로토콜은 클래스가 구현해야하는 일련의 메소드를 정의합니다. Java의 인터페이스 나 C++의 가상 기본 클래스처럼 생각할 수 있습니다. Objective-C (다중 상속을 지원하지 않음)의 차이점은 구현하려고하는 인터페이스를 상속받지 않는다는 것입니다. 특정 클래스가 프로토콜에 따라 이러한 메서드를 구현한다는 사실 만 선언하면됩니다.

이제 프로토콜은 다양한 용도로 사용되며, 코코아에서는 콜백을 위해 프로토콜을 사용합니다. 그래서 여기 ITunesFinder은 브라우저 알림을 제공하기 위해 NSNetServiceBrowser이 클래스를 호출하는 방법을 알고있는 방식으로 브라우저 프로토콜을 구현하고 있습니다.

이러한 대리자는 프레임 워크 클래스의 동작을 클래스 중 하나에 위임하여 자주 서브 클래 싱하지 않고 쉽게 사용자 지정하고 이벤트에 대한 알림을 수신하는 데 사용됩니다 (일반적으로 흥미로운 내용 전후). 매우 우아한 모델입니다. ,

+0

안녕 개빈, 내가 실제로 그 오류를 얻을 수 연타 LLVM 1.0에서 컴파일 된 :

애플의 문서는이 주제에 매우 좋다 GCC 4.2로 바꾸면 나에게도 같은 오류가 발생합니다. – fuzzygoat

+0

Gavin, 인터페이스를 업데이트했습니다 ... @interface ITunesFinder : NSObject @end 오류가 사라집니다. 귀하의 의견을 보내 주셔서 다시 한 번 감사 드리며, 나는 약간의 개념을 알고있는 분야입니다. 내가 링크 된 문서를 확인해 보겠습니다. – fuzzygoat

+0

@fuzzygoat 문제 없어, 재미있게 보내세요! :) – gavinb