2013-10-10 8 views
9

반환 값이 initinstancetype 및 관련 메서드를 사용하는 것이 좋습니다. 진행 방법은 최신 clang features을 참조하십시오. 그러나, 최선의 방법은 무엇입니까 w.r.t. NSCopying 프로토콜 (이전 모범 사례의 경우 this thread 참조)의 반환 값은 copyWithZone:입니까? clang 기사의 메서드 명명법에서 클래스를 추론하는 규칙에 언급되어 있지는 않지만이 메서드가 alloc 메서드의 반환 값과 다른 이유는 알 수 없습니다.Objective-C에서 instancetype을 복사본의 반환 유형으로 사용 하시겠습니까?

형식 추론이 copy -methods에서 작동하지 않습니까? 우리는 여전히 instancetype을 반환해야합니까 아니면 우리가 실제로 반환하는 특정 클래스 유형을 반환해야합니까?

답변

15

instancetype을 사용하지 마십시오. 여기서 명백한 경우는 변경 가능/변경 가능 구분이 있음을 의미합니다. copyNSMutableString이면 NSString이 반환되며이 값은 변경할 수 없음으로 처리해야합니다. 이 경우 API는 수신자와 동일한 유형의 인스턴스를 반환하지 않습니다.

Josh Caswell (+1)이 지적한 바와 같이 선언의 서명과 일치해야하는 또 다른 이유가 있습니다.

물론, 원하는 의미와 서명으로 자신의 프로토콜을 선언하는 것을 방해하는 것은 없습니다.

4

신고하지 않으시는 분 copyWithZone:; 그것은 프로토콜에 의해 이미 선언되어 있습니다. 클래스가 프로토콜과 일치한다고 말하면 기존 선언을 채택합니다. 이 선언은 반환 유형으로 id을 사용합니다.

물론 메서드를 구현할 때 반환 형식을 적어 줘야하지만 컴파일러는 형식 검사를 수행 할 때 정의가 아닌 선언을 사용하고 있습니다.

필자가 아는 한 instancetypeid *와 "호환"되어 있으므로 사용자 정의에 쓸 수는 있지만 엄밀히 말하면 선언과 정확히 동일한 유형을 사용하는 것이 가장 좋습니다.

따라서 id을 사용하십시오.


* 즉., 연타 약 copyWithZone:이 자사의 반환 형식으로 instancetype로 정의되는 불평하지 않습니다.