2013-04-09 3 views
12

나는 소켓 프로그래밍과 함께 일하고있다. 단지 내가 다운로드 한 코드와 관련된 의심을 분명히하고 싶었다. - mobileorchard.com - Chatty. 나는 위의 호출의 구현을 위해, Room.m 파일에서봤을 때 R & D 동안, 나는 ChatRoomViewController.m 파일왜 doesNotRecognizeSelector : 메서드를 호출할까요?

[chatRoom broadcastChatMessage:input.text fromUser:[AppConfig getInstance].name]; 

에서 함수 호출을 보았다; 이

- (void)broadcastChatMessage:(NSString*)message fromUser:(NSString*)name 
{ 
    // Crude way to emulate an "abstract" class 
    [self doesNotRecognizeSelector:_cmd]; 
} 

난 "doesNotRecognizeSelector"에 대한 검색 좀이었다 Apple에있어서, 그 오류 처리 ". 런타임 시스템 개체가 전방에 응답하거나 수없는 aSelector 메시지를 수신 할 때마다,이 메소드를 호출한다"라는 내 질문은 왜 개발자가 broadcastChatMessage : fromUser : 함수를 호출하고 거기에 아무도 사용하지 않고 어떤 메서드의 "선택자를 찾을 수 없음"예외를 처리합니까?

Stackovrflow에 따르면,이 Question에 따라 추상 클래스를 만드는 데 사용되며, "불완전한 구현"경고가 표시되지 않습니다.

나는 그 방법이 왜 Chatty Code에 사용되는지 알지 못합니다. 그 방법이 사용되는 이유를 이해하는데 도움이됩니다.

+1

응용 프로그램의 원래 개발자가 C++ 추상 기본 클래스의 기능을 에뮬레이트하려고 시도한 것처럼 보입니다.이 경우이 인스턴스는 유효하지 않습니다. 이것은 단순히 메소드가 아무것도하지 않거나 자리 표시 자 값 (보통 0 또는 NULL)을 반환하는보다 극단적 인 형식입니다. – CodaFi

답변

11

이 메서드는 런타임 호출에서 메서드가 인식되지 않을 때 예외 경로를 트리거하는 모든 NSObject 파생 개체에 존재하는 메서드입니다. 예를 들어 -foo이라는 NSString에 메시지를 보내려고하면 NSString에 유효한 방법이 아니기 때문에 메시지가 끝납니다.

이 경우 Chatty 클래스 Room은 절대로 직접 사용되지 않는 기본 클래스입니다. LocalRoomRemoteRoom에서 파생되며 두 클래스 모두 -broadcastChatMessage:fromUser의 우선 구현을 제공합니다. 아무도 그 기본 클래스 버전을 호출하지 않습니다. 그러나 "완전성"을 위해 프로그래머는 하위 클래스가 메서드를 구현하여이를 오버라이드해야한다는 것을 보장하지만 예외를 트리거하기 위해이 메서드를 호출하고 호출해야합니다.

이것은 특히 관용적 인 Objective-C가 아닙니다. "추상"클래스는 C++ 및 다른 언어의 개념입니다. 서브 클래 싱 할 "패턴"으로 만 존재하는 기본 클래스입니다. ObjC에서는 의미있는 상태가 아닐 때 공식적인 @protocol을 작성하여 수행합니다. 여기에는 (주로) 여기에 없으므로).

-doesNotRecognizeSelector:에 대한 호출은 임의적입니다. 컴파일러 경고를 피할 필요는 없으며 (메소드가 실제로 구현 되었기 때문에) 원래 작성자가 직접 예외를 던지거나 아무것도 수행하지 않았을 수 있습니다.

4

당신은 이미 자신의 질문에 대답 한 것처럼 보입니다. Objective-C에서 추상 클래스를 만드는 방법은 없으므로 throw 예외를 재정의하는 데 필요한 메소드를 갖기 위해 가장 가까운 방법입니다. 하위 클래스에서이 메서드를 재정의하면 doesNotRecognizeSelector:이 더 이상 호출되지 않습니다. 기본적으로 개발자가 하위 클래스에서이 메서드를 구현할 것을 약속하는 방법입니다.

앞서 언급했듯이이 코드를 넣지 않으면 헤더에 정의 된 메서드에 대한 구현이 없으므로 컴파일러에서 경고를 보냅니다. 이것은 구현하지 않는 것과 동일한 동작을 수행하지만 컴파일러는 의도적으로 수행하고 있음을 인식합니다.

관련 문제