myObject2에서 myObject1과 연결된 myMethod를 호출 할 때 "myObject1이 -myMethod에 응답하지 않을 수 있습니다"라는 경고 메시지가 나타 났지만 어쨌든 프로그램은 정상적으로 실행됩니다. 컴파일러가 컴파일 타임에 선언 된 메소드를 인식하지 않는 이유는 무엇입니까? 오브젝티브 C는 매우 동적 언어이기 때문에중복 컴파일러 경고
존 Doner는
myObject2에서 myObject1과 연결된 myMethod를 호출 할 때 "myObject1이 -myMethod에 응답하지 않을 수 있습니다"라는 경고 메시지가 나타 났지만 어쨌든 프로그램은 정상적으로 실행됩니다. 컴파일러가 컴파일 타임에 선언 된 메소드를 인식하지 않는 이유는 무엇입니까? 오브젝티브 C는 매우 동적 언어이기 때문에중복 컴파일러 경고
존 Doner는
자주 발생하는 경우는 개체를 포함하는 변수 유형이 수퍼 클래스의 변수 유형이고 해당 메서드가 하위 클래스에 대해서만 정의 된 경우입니다. id
으로 입력하거나 정적 입력을보다 구체적으로 지정하면이 문제를 피할 수 있습니다. 변수 유형이 클래스 자체의 변수 유형이라면, 메소드를 호출하려는 범위에서 메소드가 컴파일러에 표시되지 않을 가능성이 높습니다. 다른 대답은이 상황을 처리합니다.
이것은 내 상황을 설명하는 것에 가깝습니다. 뷰 컨트롤러에서 뷰의 뷰 메서드를 호출 중입니다. [self.view myMethod]; 컴파일러는이를 좋아하지 않지만 프로그램은 정상적으로 실행됩니다. John Doner –
그 경우에'-view' 속성이 당신의 값을 반환하지 않는다면'[(id) self.view myMethod]'또는'[(id) view myMethod]'를 대신 호출 할 수 있습니다. ivar. –
이 경고로 표시됩니다. 컴파일시, 컴파일러는 "myMethod"에 대한 선언을 찾지 못했습니다 (아마도 헤더 파일이 누락되었거나 헤더에 파일을 포함하는 것을 잊어 버렸습니까?). 그러나 Objective-C는 런타임에 추가 메서드를 만들고로드 할 수 있으므로 코드가 실행될 때까지 해당 메서드가 존재하기 때문에 경고를 생성했습니다. 따라서 경고 일뿐입니다.
대부분의 경우 해당 메서드에서 적절한 헤더 파일을 선언하지 않았을 가능성이 큽니다.
글쎄, 나는 필요한 모든 수입과 신고를했다. 하지만 이제는 컴파일러가 원 패스 컴파일러이므로 관련 클래스 파일의 메서드 정의에 도달하기 전에 메서드 호출 문을 컴파일했을 수도 있습니다. 그러나 클래스 상단에서 .h 파일을 가져 오는 것 같아 클래스의 메서드가 더 이상 호출되지 않는 곳에서 인식 될 것입니다. –
"그러나 Objective-C는 런타임시 추가 메서드를 만들고로드 할 수 있기 때문에 경고 만 생성했습니다." 아니. 객체가 실제로 그 메소드를 지원하기 때문에 만 존재합니다 (존재합니다). 그러나 컴파일 타임에 객체의 정적 유형이이를 증명하지 못하기 때문에 경고 메시지가 나타납니다. – user102008
가끔 위임 클래스를 사용하는 경우 컴파일러에서 찾을 수 있도록 위임 메서드를 사용하여 범주를 정의해야합니다.
경고는 컴파일러가 메서드 선언을 아직 보지 못했음을 의미합니다. 대부분의 다른 언어에서는 오류이므로 무시할 수없는 경고입니다.
메소드를 선언하지 않은 경우 소스 파일의 맨 위에있는 @interface 블록 (개인 메소드 인 경우) 또는 클래스 헤더 파일 (공용 메소드 인 경우)에서 메소드를 선언하십시오.
헤더 파일에 메서드를 선언 한 경우 헤더 파일을 가져와야합니다.
메서드를 선언하고 올바른 헤더 파일을 가져 오는 경우 어딘가에 오타가 있습니다. 문제를 해결할 수
@class myObject1
를 추가 일반적으로
. Ben Gottlieb 님의 답변이 Objective-C @class vs. #import 인 Stack Overflow에서 확인하십시오.
내 사람들은이 대답을 정말로 좋아하지 않습니다. 어떤 특별한 이유? –
어떤 언어입니까? –
Objective-C is my guess – Artelius
죄송합니다. Objective-C의 IPhone SDK 버전을 사용하고 있습니다. –