2010-02-26 2 views
1

나중에 상속받는 'DOInstance'클래스가 있습니다. 내가하지 않으면,목표 C : 초기화 무시에 대한 경고

- (Workflow_Workitem_Header_1px *) initWithSynckey:(NSString *)_synckey { 

    [super initWithSynckey:_synckey]; 
    //.. 
    //.. 
    return self; 
} 

지금 : 내가 가서 구현 파일에서 구현

@interface Workflow_Workitem_Header_1px: DOInstance { 

} 
//- (Workflow_Workitem_Header_1px *) initWithSynckey:(NSString *)_synckey; 
@end 

:

@interface DOInstance : NSObject { 

} 

- (DOInstance *) initWithSynckey:(NSString *)_synckey; 
@end 

가 그럼 난 DOInstance의 서브 클래스가 : 여기에 선언이다 내 하위 클래스 선언에서 initWithSynckey : (위의 주석 된 선언) 선언, 구현 경고 : "경고 : 고유 한 목표 -C 형식에서 초기화". 선언하면 경고가 사라집니다. 괜찮아.

에 이동 :

나중에 내 서브 클래스의 인스턴스 수행 이제

Workflow_Workitem_Header_1px *instance; 
instance = [[Workflow_Workitem_Header_1px alloc] initWithSynckey:@"xxxx"]; 

을,이에 상관없이 내가 해당 initWithSynckey를 선언 여부 나에게 같은 경고를 (제공 : 선택기를 내 서브 클래스는 즉, "경고 : 뚜렷한 목표 - C 형의 초기화"..

내가 뭘 잘못 INI

+0

예, 하위 클래스의 이름이 이상하다는 것을 알고 있습니다. 현재 필자가 손으로 썼지 만 나중에 하위 클래스가 일부 메타 데이터를 기반으로 '생성'될 것으로 기대합니다. – ArjunShankar

+0

그래서 Workflow_Workitem_Header_1px를 인스턴스화하면 포인터를 이미 반환하고 있으므로 별을 꺼낼 수 있습니다. Workflow_Workitem_Header_1px instance = [[Workflow_Workitem_Header_1px alloc] initWithSynckey : @ "xxxx"]; 그게 효과가 있습니까? 생성자 (Workflow_Workitem_Header_1px *)의 반환 값을 id로 바꿀 수도 있습니다. – Ronald

+0

Objective-C 클래스와 함께 항상 _ 포인터를 사용해야합니다. 사실, 컴파일러가 "오류 : Objective-C 클래스 'NSString'의 정적으로 할당 된 인스턴스 또는 무엇이든을 알려주기 때문에 사용하지 않아도됩니다. –

답변

2

방법 이름? t ... 클래스의 유형이 아닌 반환 유형 (id)이 있어야합니다. 예제는 NSString.h와 NSArray.h (다른 클래스들도)에서 확인하십시오. 그것은 당신의 문제를 일으키는 원인 일 수 있습니다.

+0

예, 사실 그것은 문제였습니다. 나는 지금까지 이것을 몰랐다. 감사! – ArjunShankar

0

이 경우, 재정의 메소드는 수퍼 클래스의 선언과 동일한 유형을 리턴해야합니다.

DOInstance이 정의

- (DOInstance *) initWithSynckey:(NSString *)_synckey; 

그래서 Workflow_Workitem_Header_1px은 다음과 같이해야합니다

@interface Workflow_Workitem_Header_1px: DOInstance { 
} 
- (DOInstance *) initWithSynckey:(NSString *)_synckey; 
@end 

당신은 경고를받을 때마다 "경고 : 뚜렷한 목표 - C 형의 초기화를"당신이하고있는 타이핑에 위배되는 것 : 메소드 서명 변경 등.

+0

재정의 된 메서드가 원래 정의에 사용 된 형식의 하위 클래스를 반환하기 때문에 문제가되지 않는다고 생각했습니다. 나는 대부분의 NS * 클래스와 마찬가지로 모든 레벨의 리턴 (id)을 갖도록 수정했다. – ArjunShankar

+0

Objective-C 인스턴스가 여전히 반환 중이며, Objective-C가 늦게 바인딩되어 있기 때문에 수신자가 이해할 수있는 메시지를 보내면 모든 것이 여전히 작동합니다. 경고는 거기에 타입을 선언하는 방법에 원숭이를 짓고 있고, 컴파일러는 일을 할 수 있다고 보장하지 못한다고 알려줍니다. Objective-C에는 _optional_ manifest 입력이 있습니다. 실제로 모든 유형 정보가 필요하지 않습니다. -foo {return [[NSString alloc] init]}은 완벽하게 허용되는 방법입니다. (글쎄, "형식 정보가 없음"은 "모든 것이 ID 임"을 의미합니다.) –

관련 문제