2011-10-10 2 views
0

프로젝트를 컴파일 할 때 x-code 환경은 myInit :: found라는 이름의 메소드가 여러 개 있다고 알려주지 만 존재하지는 않습니다.xcode 4.1 노란색 삼각형?

UIControl의 하위 클래스를 만들었으므로 맞춤 초기화 프로그램이 필요했습니다. 나는 이렇게 정의한 myInit이라고 불렀다 :

- (id)myInit:(float)Left:(ExecData *)Exec 
{ 
    self = [super initWithFrame:CGRectMake(Left, 0.0, 120.0, 200.0)]; 

    if (self) 
    {   
     exec = Exec; 
     [self initialise]; // another method 
    } 

    return self; 
} 

내 클래스는 ExecSummaryControl이라고 불린다. 따라서이 클래스를 기반으로 개체를 인스턴스화하려면 다음과 같이 입력합니다.

ExecSummaryControl *control = [[ExecSummaryControl alloc]myInit:20.0:myExec]; 

여기서 myExec는 ExecData 유형의 개체입니다.

이 모든 기능은 원하는대로 작동하지만 x 코드 개발 환경에서는 인스턴스화 행에 대해 노란색 삼각형이 표시되어 myInit의 여러 인스턴스가 발견되었습니다. 다중 인스턴스가 없으며 코드가 정상적으로 실행됩니다. 어쩌면 x- 코드가 캐시 된 이전 코드를 어딘가에 컴파일 했나요? 나는 Project -> Clean을 시도했지만 기쁨은 없다.

누구나 내가이 잘못된 경고를 제거 할 수있는 아이디어가 있습니까?

+0

myInit의 이름을 다른 것으로 변경하면 어떻게됩니까? – bryanmac

답변

2

Learning Objective-C: A Primer: Methods and MessagingThe Objective-C Programming Language: Object Messaging을 실제로보아야합니다.

표시되는 사용자 지정 init 메서드에는 명명되지 않은 매개 변수가 있습니다. 우리는 당신의 방법 서명에 약간의 간격을 넣으면 즉

, 그것은이다 :

- (id)myInit:(float)Left :(ExecData *)Exec; 

두 번째 매개 변수는 :(ExecData *)의 결장 전에 라벨 또는 이름이 없습니다. 나는 이런 식으로 방법을 바꾸기 고려할 것 :

- (id)initWithLeftEdgeAtX:(CGFloat)left execData:(ExecData *)anExecData 
{ 
    self = [super initWithFrame:CGRectMake(left, 0.0, 120.0, 200.0)]; 

    if (self) 
    {   
     exec = anExecData; 
     [self initialise]; // another method 
    } 

    return self; 
} 

당신이 가능성도 또한 이름이있는 -myInit:: 방법이 프로젝트에서 다른 클래스를 가지고 있기 때문에 컴파일러에서 경고하는 것을 얻고있는 이유를

이 컴파일러는 당신이 실제로 메소드를 구현하는 객체의 인스턴스의 메소드를 호출하는 경우보고에 의해 당신을 위해 몇몇 검사를 수행하려고
- (id)myInit:(NSString *)someString :(SomeClass *)anUnnamedParameter; 

(일명 "선택에 응답 : 예는 다음과 같은 매개 변수, "). 예를 들어, NSString의 인스턴스에서 NSArray-objectAtIndex: 메소드를 호출하고 싶지 않을 것입니다. 이름없는 매개 변수를 사용하기 때문에 메서드 서명은 두 개 이상의 클래스에서 -myInit::이므로 컴파일러는 사용자가 의미하는 것이 확실하지 않다고 말합니다. 그게 내가 제안한 것과 같은 명명 된 매개 변수를 사용했는지 확인해야하는 더 많은 이유입니다. 메소드 서명이 다음 쉽게 컴파일러가 제대로 메소드를 호출하는 것으로 나타 여부를 선행 확인할 수 있도록 할 수있게하는, -initWithLeftEdgeAtX:execData:을 것

ExecSummaryControl *control= [[ExecSummaryControl alloc] initWithLeftEdgeAtX:20.0 
                   execData:myExec]; 

처럼

그런 다음 초기화가 보일 것이다.

+0

죄송합니다, 저는 C# 개발자이고 여전히 obj-c로 발을 찾으려고합니다. 나는 충고에 감사한다. –