2011-09-08 4 views
1

특정 XML 파일을 처리하는 범주로 내 클래스 중 하나를 확장했습니다. 클래스 ListBuilder.m에서 나는 목록이 작성된 후에 항목 목록을 단순히 순환하는 newsloop이라는 메소드를 정의했습니다.Objective-C 메서드 범주 호출 질문 :

-(void)newsloop;ListBuilder.m으로 선언 된 개인 범주로 선언됩니다. (이 중요한 경우, 4)

-(void) parserDidEndDocument: (NSXMLParser *)parser { 
    if ([self.newslist count] >= 2) 
     [self newsloop]; // warning flagged here 
    else 
     // to some other default stuff 
} 

엑스 코드를 경고 Method '-newsloop' not found (return type defaults to 'id')을 보여줍니다 목록이 구축되고 나면 내가 newsloop 전화 어디에 내 카테고리, ListBuilder+XMLParser.m에서는

이다.

내가 맞으면 카테고리가 확장되는 클래스에 정의 된 모든 메소드에 액세스 할 수 있으므로 경고가 발생하는 이유는 무엇입니까?

답변

2

컴파일러는 여전히 newsloop 메서드 (또는 선택기)가 있는지 알아야합니다. 카테고리 파일을 컴파일 할 때이 메소드는 아무 곳에서도 선언되지 않았으므로 경고를 생성합니다.

이 메서드를 비공개로 유지하려면 공유 개인 메서드를 선언하는 ListBuilder + Private.h 파일을 만들어 ListBuilder.m과 ListBuilder + XMLParser 범주 모두에 포함시켜야합니다.

기술적으로 코드의 사용자는 헤더 자체를 포함 할 수도 있고 메서드를 호출 할 수도 있지만 Objective-C에는 private/public 메서드가 없기 때문에 다른 방법으로도이를 수행 할 수 있습니다. 또한 헤더에 'Private'이 포함되어 있고 메소드를 호출하는 것이 문제가 아니라 사용자의 문제입니다.

1

클래스는 헤더 파일에 선언되어 있지 않으므로 newsloop 메서드가 클래스에 있음을 알지 못합니다. 비공개 카테고리에서만 그래서 경고를받는 것입니다. 메소드가 헤더 파일 또는 클래스가 구현하는 프로토콜에 선언해야합니다.

+0

내가 읽은 문서에는 그 부분이 언급되어 있지 않았습니다. 어쩌면 감독일까요? –

+1

모든 상황이 문서에있는 것은 아니지만 헤더 파일을 사용하여 클래스 기능을 해당 클래스의 사용자에게 전달할 수 있습니다. 비공개 카테고리는 헤더에 없으므로 클래스 구현 파일 외부의 코드는 알지 못합니다. –