문제

누구든지 차이점을 설명 할 수 있습니까? 프로토콜 그리고 카테고리 객관적인 C에서? 언제 다른 하나를 사용합니까?

도움이 되었습니까?

해결책

프로토콜은 Java의 인터페이스와 동일합니다. 본질적으로 계약입니다. "이 프로토콜을 구현하는 모든 클래스도 이러한 방법을 구현할 것입니다."

반면에 카테고리는 메소드를 클래스에 바인딩합니다. 예를 들어, 코코아, 나는 카테고리를 만들 수 있습니다 NSObject 이를 통해 메소드를 추가 할 수 있습니다 NSObject 클래스 (그리고 물론 모든 서브 클래스), 비록 내가 실제로 접근 할 수 없지만 NSObject.

요약: 프로토콜은 클래스가 구현할 방법을 지정합니다. 카테고리는 기존 클래스에 메소드를 추가합니다.

그러면 각각의 적절한 사용은 분명해야합니다. 프로토콜을 사용하여 클래스가 구현 해야하는 일련의 방법을 선언하고 범주를 사용하여 기존 클래스에 메소드를 추가하십시오.

다른 팁

프로토콜은 "여기에 내가 원하는 몇 가지 방법이 있습니다. 카테고리는 "이러한 추가 방법 으로이 클래스의 기능을 확장하고있다"고 말했다.

이제 나는 당신의 혼란이 Apple의 "비공식 프로토콜"이라는 문구 사용에서 비롯된 것 같습니다. 키 (그리고 가장 혼란스러운) 요점은 다음과 같습니다. 비공식 프로토콜은 실제로 프로토콜이 아닙니다. 실제로 NSObject의 범주입니다. Cocoa는 비공식 프로토콜을 널리 사용하여 대표를위한 인터페이스를 제공합니다. 이후 @protocol 구문은 Objective-C 2.0까지 옵션 방법을 허용하지 못했습니다. Apple은 옵션 방법을 구현하여 아무것도하지 않거나 더미 값을 반환하고 예외를 던지기 위해 필요한 방법을 구현했습니다. 컴파일러를 통해 이것을 시행 할 방법이 없었습니다.

이제 Objective-C 2.0으로 @protocol 구문이 지원합니다 @optional 키워드, 프로토콜의 일부 메소드를 선택 사항으로 표시합니다. 따라서 귀하의 클래스는 다음과 같이 표시된 모든 방법을 구현하는 한 프로토콜을 준수합니다. @required. 컴파일러는 클래스가 필요한 모든 방법을 구현하는지 여부를 결정할 수 있습니다. iPhone SDK는 독점적으로 Objective-C 2.0을 사용합니다 @protocol 구문은 새로운 개발에 사용하지 않는 좋은 이유를 생각할 수 없습니다 (이전 버전의 Mac OS X에서 실행 해야하는 Mac OS X Cocoa 앱 제외).

카테고리 :

카테고리는 클래스 자체를 수정하지 않고 기존 클래스의 모든 인스턴스에 새로운 방법을 추가하는 방법입니다.

해당 클래스에서 파생하거나 원래 클래스를 다시 작성하지 않고 기존 클래스에 기능을 추가하려는 경우 카테고리를 사용합니다.

당신이 사용하고 있다고 가정 해 봅시다 NSView 코코아의 물체는 NSView 어떤 행동을 수행 할 수있었습니다. 분명히, 당신은 다시 작성할 수 없습니다 NSView 클래스, 그리고 당신이 그것으로부터 파생 되더라도 NSView 프로그램의 객체는 파생 유형입니다. 해결책은 범주를 작성하는 것입니다 NSView, 그런 다음 프로그램에서 사용합니다. 당신만큼 #import 카테고리 선언이 포함 된 헤더 파일은 마치 마치 모든 NSView 객체는 Catagory 소스 파일에 정의 된 메소드에 응답합니다.

프로토콜 :

프로토콜은 모든 클래스가 구현하도록 선택할 수있는 방법 모음입니다.

특정 클래스가 특정 메소드 세트에 응답한다는 보장을 제공하려면 프로토콜을 사용합니다. 클래스가 프로토콜을 채택하면 프로토콜 헤더에서 선언 된 모든 방법을 구현할 것을 약속합니다. 이는 해당 클래스를 사용하는 다른 클래스가 클래스에 대해 다른 방법을 알 필요없이 해당 방법이 구현 될 것이라고 확신 할 수 있음을 의미합니다.

이것은 모두 공통 "컨트롤러"클래스와 통신 해야하는 유사한 클래스 제품군을 만들 때 유용 할 수 있습니다. 컨트롤러 클래스와 제어 클래스 간의 통신은 모두 단일 프로토콜로 포장 될 수 있습니다.

참고 사항 : Objective-C 언어는 다중 상속을 지원하지 않지만 (클래스는 하나의 슈퍼 클래스에서만 도출 될 수 있음), 클래스가 여러 다른 프로토콜을 준수 할 수 있기 때문에 프로토콜에서 동일한 기능을 제공 할 수 있습니다.

내 이해 프로토콜은 Java의 인터페이스와 약간 비슷합니다. 프로토콜은 방법을 선언하지만 구현은 각 클래스에 달려 있습니다. 카테고리는 루비의 믹스 인과 같은 것 같습니다. 카테고리를 사용하면 기존 클래스에 메소드를 추가 할 수 있습니다. 내장 클래스조차도.

프로토콜을 사용하면 특정 클래스 나 범주에 국한되지 않은 메소드 목록을 선언 할 수 있습니다. 프로토콜에 선언 된 방법은 모든 클래스/카테고리를 채택 할 수 있습니다. 프로토콜을 채택하는 클래스 또는 카테고리는 프로토콜에 선언 된 모든 필요한 방법을 구현해야합니다.

범주를 사용하면 기존 클래스에 추가 메소드를 추가 할 수 있지만 추가 인스턴스 변수는 허용하지 않습니다. 범주가 추가되는 메소드는 클래스 유형의 일부가됩니다.

프로토콜은 지정된 방법을 구현하기위한 계약입니다. 프로토콜을 준수하는 모든 객체는 해당 방법에 대한 구현을 제공하는 데 동의합니다. 프로토콜을 잘 사용하는 것은 대의원을위한 일련의 콜백 메소드를 정의하는 것입니다 (대의원이 모든 방법에 응답 해야하는 경우).

카테고리는 메소드 (클래스 또는 인스턴스 메소드)에 메소드를 추가하여 현재 객체를 확장 할 수있는 기능을 제공합니다. 카테고리를 잘 사용하면 NSString 클래스를 확장하여 이전에 없었던 기능을 추가하여 수신기를 1337 5P34K로 변환하는 새 문자열을 작성하는 것과 같이 이전에 없었던 기능을 추가하는 것입니다.

NSString *test = @"Leet speak";
NSString *leet = [test stringByConvertingToLeet];

Sgkochan의 "Objective-C의 프로그래밍"의 정의 :

카테고리 :

카테고리는 클래스의 정의를 그룹 또는 관련 방법의 범주로 모듈화 할 수있는 쉬운 방법을 제공합니다. 또한 클래스의 원래 소스 코드에 액세스하지 않고 서브 클래스를 만들 필요없이 기존 클래스 정의를 쉽게 확장 할 수 있습니다.

프로토콜 :

프로토콜은 클래스간에 공유되는 메소드 목록입니다. 프로토콜에 나열된 방법에는 해당 구현이 없습니다. 그들은 다른 사람이 구현해야합니다 (당신처럼!). 프로토콜은 지정된 이름과 어떻게 든 관련된 일련의 메소드를 정의하는 방법을 제공합니다. 이 방법은 일반적으로 수행 방법을 알고 원하는 경우 자신의 클래스 정의에서 구현할 수 있도록 문서화됩니다. 프로토콜은 선택적으로 구현할 수있는 일련의 메소드 및 구현 해야하는 메소드 세트를 나열합니다. 특정 프로토콜에 필요한 모든 방법을 구현하기로 결정한 경우 해당 프로토콜을 준수하거나 채택한다고합니다. 모든 방법이 선택 사항이거나 모두 필요한 프로토콜을 정의 할 수 있습니다.

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