2009-12-12 2 views
2

myObject2에서 myObject1과 연결된 myMethod를 호출 할 때 "myObject1이 -myMethod에 응답하지 않을 수 있습니다"라는 경고 메시지가 나타 났지만 어쨌든 프로그램은 정상적으로 실행됩니다. 컴파일러가 컴파일 타임에 선언 된 메소드를 인식하지 않는 이유는 무엇입니까? 오브젝티브 C는 매우 동적 언어이기 때문에중복 컴파일러 경고

존 Doner는

+0

어떤 언어입니까? –

+2

Objective-C is my guess – Artelius

+0

죄송합니다. Objective-C의 IPhone SDK 버전을 사용하고 있습니다. –

답변

0

자주 발생하는 경우는 개체를 포함하는 변수 유형이 수퍼 클래스의 변수 유형이고 해당 메서드가 하위 클래스에 대해서만 정의 된 경우입니다. id으로 입력하거나 정적 입력을보다 구체적으로 지정하면이 문제를 피할 수 있습니다. 변수 유형이 클래스 자체의 변수 유형이라면, 메소드를 호출하려는 범위에서 메소드가 컴파일러에 표시되지 않을 가능성이 높습니다. 다른 대답은이 상황을 처리합니다.

+0

이것은 내 상황을 설명하는 것에 가깝습니다. 뷰 컨트롤러에서 뷰의 뷰 메서드를 호출 중입니다. [self.view myMethod]; 컴파일러는이를 좋아하지 않지만 프로그램은 정상적으로 실행됩니다. John Doner –

+0

그 경우에'-view' 속성이 당신의 값을 반환하지 않는다면'[(id) self.view myMethod]'또는'[(id) view myMethod]'를 대신 호출 할 수 있습니다. ivar. –

2

이 경고로 표시됩니다. 컴파일시, 컴파일러는 "myMethod"에 대한 선언을 찾지 못했습니다 (아마도 헤더 파일이 누락되었거나 헤더에 파일을 포함하는 것을 잊어 버렸습니까?). 그러나 Objective-C는 런타임에 추가 메서드를 만들고로드 할 수 있으므로 코드가 실행될 때까지 해당 메서드가 존재하기 때문에 경고를 생성했습니다. 따라서 경고 일뿐입니다.

대부분의 경우 해당 메서드에서 적절한 헤더 파일을 선언하지 않았을 가능성이 큽니다.

+1

글쎄, 나는 필요한 모든 수입과 신고를했다. 하지만 이제는 컴파일러가 원 패스 컴파일러이므로 관련 클래스 파일의 메서드 정의에 도달하기 전에 메서드 호출 문을 컴파일했을 수도 있습니다. 그러나 클래스 상단에서 .h 파일을 가져 오는 것 같아 클래스의 메서드가 더 이상 호출되지 않는 곳에서 인식 될 것입니다. –

+0

"그러나 Objective-C는 런타임시 추가 메서드를 만들고로드 할 수 있기 때문에 경고 만 생성했습니다." 아니. 객체가 실제로 그 메소드를 지원하기 때문에 만 존재합니다 (존재합니다). 그러나 컴파일 타임에 객체의 정적 유형이이를 증명하지 못하기 때문에 경고 메시지가 나타납니다. – user102008

0

가끔 위임 클래스를 사용하는 경우 컴파일러에서 찾을 수 있도록 위임 메서드를 사용하여 범주를 정의해야합니다.

1

경고는 컴파일러가 메서드 선언을 아직 보지 못했음을 의미합니다. 대부분의 다른 언어에서는 오류이므로 무시할 수없는 경고입니다.

메소드를 선언하지 않은 경우 소스 파일의 맨 위에있는 @interface 블록 (개인 메소드 인 경우) 또는 클래스 헤더 파일 (공용 메소드 인 경우)에서 메소드를 선언하십시오.

헤더 파일에 메서드를 선언 한 경우 헤더 파일을 가져와야합니다.

메서드를 선언하고 올바른 헤더 파일을 가져 오는 경우 어딘가에 오타가 있습니다. 문제를 해결할 수

@class myObject1 

를 추가 일반적으로

-2

. Ben Gottlieb 님의 답변이 Objective-C @class vs. #import 인 Stack Overflow에서 확인하십시오.

+0

내 사람들은이 대답을 정말로 좋아하지 않습니다. 어떤 특별한 이유? –

관련 문제