iPhone SDK가 일부 대표자에게 프로토콜이 아닌 카테고리를 사용하는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/900335

문제

내 이해는 프로토콜이 다른 언어의 인터페이스와 같다는 것입니다. 예상 방법을 선언합니다. 카테고리는 기존 유형 (아마도 소유하지 않는 유형에도 새로운 방법을 추가 할 수 있습니다).

그렇다면 iPhone SDK가 때때로 대의원 유형을 선언하기 위해 카테고리를 사용하는 이유는 무엇입니까? 일반적으로 나는 모든 대표자가 입력 한 ID를 입력 할 것으로 기대합니다.u003CMyDelegateProtocol> 그러나 이것이 사실이 아닌 많은 예가 있습니다.

예를 들어, nsurlconnection을 참조하십시오. 대의원은 "ID"를 입력하고 '계약'은 nsObject (nsurlConnectionDelegate)의 범주로 선언됩니다.

그래서 :이 경우 카테고리를 사용하는 동기는 무엇입니까?

도움이 되었습니까?

해결책

Objective-C 2.0은 @optional 프로토콜 지시문을 소개하여 특정 프로토콜 메소드를 선택 사항으로 선언 할 수 있습니다. OBJ-C 2.0 이전에 카테고리는 선택적 대의원 방법 (특히 nsobject의 범주, 즉 비공식 프로토콜).

내 생각에 iPhone SDK에서 프로토콜의 대부분의 범주 사용은 동등한 MAC 클래스의 보류라는 것입니다. 예를 들어, NSURLConnection Mac 및 iPhone SDK에 모두 존재하므로 코드가 공유 될 수 있습니다. 애플은 아직 공식적인 프로토콜을 사용하기 위해 모든 MAC 클래스를 변경하기 위해 아직 통과하지 않았기 때문에 우리는 다소 불일치가 남아 있습니다.

다른 팁

OS X 10.5와 "Objective-C 2.0"이라는 iPhone SDK로 롤아웃 된 Objective-C의 개정이 카테고리를 사용하여 선택적 프로토콜 만 만들 수 있습니다. Objective-C 2.0에서, 새로운 @optional 키워드가 프로토콜에 추가되어 어떤 메소드가 선택 사항인지를 표시했습니다 (나머지는 암시 적으로 필요합니다).

그래서 나는 당신이 보는 것이 @optional 키워드 이전의 초기부터 약간의 보류라고 생각합니다.

편집 : 원래 질문에 나타난 후속 조치에 답하기 위해 : 비공식 프로토콜을 위해 NSObject/ID에서 카테고리를 사용하는 동기는 부분적으로 데이터 소스에서 호출 할 수있는 방법을 문서화하고 그룹화하는 것입니다. , 컴파일러가 모르는 메소드를 호출하는 대상이 될 것이라는 컴파일러 경고를 피하기 위해 덜 정도. 이러한 데이터 소스 메소드를 호출하는 클래스를 구현하는 사람이라고 상상해보십시오. 아마도 My를 호출하는 데 관심이있을 때마다 [OBJ ResponseLector : @Selector (MY : DataSource : Method :)] 메소드가 존재하는지 확인하고 싶을 것입니다. : DataSource : 메소드 : 객체 OBJ의 메소드.

이는 "옵션 프로토콜 방법"이없는 Objective-C 1.0에서 나온 유산입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top