2010-11-19 4 views
2

저는 3 개의 클래스가있는 프로젝트에서 Apple, Orange 및 Pear이라고합시다.Xcode의 잘못된 경고는 "X 프로토콜을 구현하지 않습니다"

Apple 및 Orange에는 모두 대리인 속성이 있습니다.
둘 다 AppleDelegate 및 OrangeDelegate라는 헤더 파일에 프로토콜을 정의합니다.

- (id)initWithDelegate:(id<AppleDelegate>)delegate 
- (id)initWithDelegate:(id<OrangeDelegate>)delegate 

배는 OrangeDelegate를 구현하고 다음과 같이 정의된다 :

Orange *anOrange = [[[Orange alloc] initWithDelegate:self] autorelease]; 

결과 그 :

@interface Pear : NSObject <OrangeDelegate> 

내부 배, 나는이 전화를
그들은 각각 유사한 서명이 초기화가 이 컴파일러 경고 :

Class 'Pear' does not implement the 'AppleDelegate' protocol 

컴파일러가 초기화 프로그램의 프로토콜을 인식하지 못하는 것 같습니다.

- (id)initWithDelegate:(id)delegate 

내가 배의 초기화에 "정의로 이동"을 클릭하면 때문에,이 옵션으로 두 클래스를 제공합니다 : 즉, 그것은 단지 모두이 서명을 인식합니다.

내 방법의 이름을 변경하는 것 외에이 경고를 수정할 수있는 방법이 있습니까?

+0

그 이상한 당신은 배를 사과 대표로 지정하지 않습니다. 무언가는 당신의 방어에서 벗어나야합니다. – Daniel

+0

@ 대니얼 - 그건 제가 생각한 것입니다,하지만 나는 그렇지 않습니다. 방금 애플을 추가하면 경고가 나타납니다. 오렌지와 배 모두 그 전에 존재했고 경고없이 컴파일되었습니다. Apple을 추가 할 때 Orange 또는 Pear도 수정되지 않았지만 갑자기 경고를 던지기 시작했습니다. – DougW

답변

3

'alloc'은 'id'유형을 반환하도록 정의 된 NSObject에서 상속 된 메서드입니다. 따라서 다음과 같습니다.

[Orange alloc] 

'id'유형의 개체로 평가됩니다. 그런 다음 해당 객체에서 initWithDelegate를 호출하면 컴파일러는 유형을 알지 못하며이 경우 잘못된 객체를 추측합니다. 그래서 당신이 경고를 제거 할 수 있습니다 : 생성자는 목표 - C에서 언어 수준의 기능, 단지 컨벤션하지 않기 때문에

Orange *anOrange = [[(Orange *)[Orange alloc] initWithDelegate:self] autorelease]; 

그래서, 기본적으로, 그것은이다.

편집 : 아래 참조; 아무것도보다 더 복잡 없을 것 오렌지

+ (Orange *)alloc; 

: : 나는 다른 솔루션을 추가하는 것입니다 생각 나는 그것이 부분적으로 디자인 결정 추측

+ (Orange *)alloc 
{ 
    return [super alloc]; 
} 

를 - 클래스는 것을 알고에 대한 책임을 져야한다 그들의 생성자 메서드는 다른 클래스의 이름과 충돌하거나 같은 생성자로 여러 클래스 정의를 가져 오는 파일이 모호하지 않게 처리해야합니다. 신택스의 단순한 모습이 클린 처일지도 모르겠다.

+0

아, 맞아. 나는 (id)로 자기 주조하는 것도 경고를 제거한다는 것을 알았다. 어느 쪽이든은 다소 절뚝 거리며 추한 사람이지만, 이니셜 라이저의 이름을 바꾸거나 이니셜 라이저의 이름을 바꾸는 것처럼 보입니다.감사. – DougW

+0

잠시 생각해 본 결과 (이 문제에 관해 적절한 조언을 한 번도 본적이 없으며, 첫 번째 원칙에서 대답하고 있습니다.) NSObject에서 상속하는 대신 init을 오버라이드 할 수 있다고 생각합니다. 나는 그것을 소스 코드로 말하기가 가장 쉽기 때문에 편집했다. – Tommy

관련 문제