2013-05-29 4 views
7

어제 한 동료가 초기화 메소드 (initWith ... : (...))를 선언해서는 안된다는 질문을 던졌습니다. 나는 그 질문에 대해 꽤 놀랐다. 그리고 나의 이해에서 이것은 말도 안되는 것이다. 하지만 확실한 이유는 찾을 수 없지만 프로토콜에서 init 메소드를 선언하면 구현에 유연성이 떨어집니다.목적 코드 초기화

프로토콜에 init 메소드가 있어야하는 이유는 무엇입니까?

감사합니다.

답변

6

코드를 다른 사람이 구현 한 메서드를 호출 할 수 있도록 프로토콜에 메서드를 정의합니다.이

  • 다른 누군가가 구현하는 객체를 생성,
  • 다른 사람이 프로토콜을 구현하는 당신은 프로토콜을 정의
    • : 당신과 당신의 프로토콜을 구현하는 개발자 사이의 "계약"은 다음과 같습니다 귀하의 프로토콜, 그리고 그것을 제공, 그래서
    • 당신의 프로토콜의 구현을 모르고 호출 할 수 있습니다.

    프로토콜의 메서드를 호출하려면 해당 프로토콜의 인스턴스를 구현해야합니다. 프로토콜을 정의하는 전체 요점은 프로토콜에서 구현하는 클래스에 대한 지식을 코드에서 제거하는 것입니다. 어떤 클래스를 사용하는지 알면 프로토콜을 건너 뛰고 클래스에 직접 프로그래밍 할 수도 있습니다. 그러나 init으로 전화하려면 해당 클래스를 알아야합니다. 그렇지 않으면 다른 사람이 이 아직 호출되지 않은 alloc -ed 개체를 전달해야합니다. 첫 번째 방법은 프로토콜을 사용하는 목적을 없애고 두 번째 방법은 호출자가 부분적으로 초기화 된 객체를 처리하도록합니다.

    이 프로토콜의 비 init 구성 방법을 가지고에서 당신을 방지하지 않습니다

    참고 : 모든 개체 정보의 특정 비트를 사용하여 구성해야하는 경우, 사용자가 원하는대로 init을 구현하자와에 configureWith:... 방법을 추가 사용자의 프로토콜 인 init 메소드에 대해 알지 못해도 객체 구성 프로세스를 제어 할 수 있습니다.

  • +0

    그렇지 않으면 정상적인 연습이 될 수 있습니까? ** 다른 사람이 ** 인터페이스를 구현하는 개체를 만듭니다. ** ** **? – SeriousBob

    +0

    @SeriousBob 오브젝트를 작성하면 오브젝트의 유형과 구현되는 모든 프로토콜을 알 수 있습니다. 이 경우'init' (또는 그 밖의 다른 메소드)가 프로토콜의 일부라는 사실을 알면 더 이상 필요하지 않습니다. – dasblinkenlight

    +0

    좋아요, 왜 NSCoding 프로토콜에 initWithCoder : 메소드가 있습니까? – SeriousBob

    3

    init ... 메소드가있는 iOS SDK의 일부 프로토콜을 알고 있습니다. 예를 들어 NSCoding Protocol에는 - initWithCoder : 필수 메소드가 있습니다. 나는 그것이 정상적인 연습이라고 생각한다.