예를 들어 메시지의 수신자 유형 ***는 전달 선언입니다.


199

내 iOS5 앱에는 NSObject States수업이 있으며 초기화하려고합니다.

states = [states init];

여기에 init방법이 있습니다 States:

- (id) init
{
    if ((self = [super init]))
    {
        pickedGlasses = 0;
    }

    return self;
}

그러나 라인에 오류가 있습니다 states = [states init];

예를 들어 메시지의 수신자 유형 "상태"는 전달 선언입니다.

무슨 뜻인가요? 내가 뭘 잘못하고 있죠?


나는 같은 질문을 피하려고 노력했지만 각 탐마다 다른 해결책이 있습니다. 조금 혼란 스러워요
SentineL

3
가장 간단한 대답은 #import (아마 접두사 파일에 있음)가 없거나 "@class Abc;"가없는 것입니다. 줄 (예 : @interface 줄 바로 위에있는 .h 파일)
Fattie

답변:


440

이는 기본적으로 States 선언이 포함 된 .h 파일을 가져와야 함을 의미합니다.

그러나 코드에 다른 많은 문제가 있습니다.

  • 당신은 개체를 초기화하지 않고 있습니다. +alloc ' 있습니다. 작동하지 않습니다
  • 객체를 포인터가 아닌 유형으로 선언하면 작동하지 않습니다.
  • 당신은 호출하지 않을 [super init]에서 -init.
  • @class헤더에서를 사용하여 클래스를 선언했지만 클래스를 가져 오지 않았습니다.

필자의 경우 .h순환 참조 문제로 인해 파일을 제거 했으므로 조금 이상 합니다.
Alper

정말 말도 안되는 말입니다. 그러나 그렇습니다.
TimJowers2

Objective-C에서 Swift 객체를 사용하려는 경우 객체를 상속해야한다는 것을 잊지 마십시오 NSObject.
Michal Šrůtek

27

FWIW, 기존 프로젝트에 핵심 데이터를 구현할 때이 오류가 발생했습니다. CoreData.h를 내 프로젝트에 연결하는 것을 잊었습니다. 이미 CoreData 프레임 워크를 프로젝트에 추가했지만 Apple 템플릿과 마찬가지로 미리 컴파일 된 헤더의 프레임 워크에 연결하여 문제를 해결했습니다.

#import <Availability.h>

#ifndef __IPHONE_5_0
#warning "This project uses features only available in iOS SDK 5.0 and later."
#endif

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import <CoreData/CoreData.h>
#endif

2
거의 모든 CoreData 튜토리얼이 템플릿을 사용하지만 기존 프로젝트가 아닌 템플릿을 사용한다는 것은 부끄러운 일입니다. 여기서 실수하는 것은 매우 쉽습니다.
Yeung

24

서로 의존하는 두 개의 파일이있을 때 이런 종류의 메시지가 나타납니다. 여기서 까다로운 점은 헤더 파일에서 서로 가져 오려고하면 (클래스 A는 클래스 B를 가져오고, 클래스 B는 클래스 A를 가져 오면) 순환 참조를 얻는다는 것입니다. 따라서 @class A클래스 (B 클래스) 헤더 파일 중 하나에 forward ( ) 선언을 배치 하십시오. 그러나 클래스 B의 구현 내에서 클래스 A의 ivar을 사용하려고하면이 오류가 #import "A.h"발생합니다. 클래스 B의 .m 파일에 a를 추가 하면 문제가 해결되었습니다.


16

사용하려고했습니다 @class "Myclass.h".

로 변경하면 #import "Myclass.h"정상적으로 작동했습니다.


여기서 단지 참고 사항 : @class "Myclass.h"완전히 잘못되었습니다. @class Myclass클래스를 가져올 수없는 (Objective-C의 Swift 정의 클래스에서 발생하는 순환 참조로 인해) 헤더 파일에 #import "Myclass.h"사용해야 하지만 가져올 수있는 경우 사용해야합니다.
사용자가 아닌 사용자

6

사용하고 있습니다

States states;

당신이 사용해야 할 곳

States *states;

init 메소드는 다음과 같아야합니다

-(id)init {
  if( (self = [super init]) ) {
      pickedGlasses = 0;
  }
  return self;
}

이제 States 클래스에 대한 객체를 만들 때 이와 같이해야합니다.

State *states = [[States alloc] init];

이것이 가장 좋은 방법은 아닙니다. 그러나 객체 초기화의 기본적인 사용법을 이해하는 데 도움이 될 수 있습니다.


5

Objective C에서 Swift 클래스 또는 메소드를 사용하려고 할 때이 오류가 발생하는 경우이 다이어그램에 정의 된 2 단계 Apple 중 하나를 잊었습니다.

여기에 이미지 설명을 입력하십시오

예:

Test.m파일 에 오류가 나타납니다 :

클래스 메시지의 수신자 'MyClass'는 전달 선언입니다.

1 단계 : 검사 Test.h

@class MyClass;

2 단계 : 빌드 설정*-Swift.h 에서 파일 이름을 찾습니다 ( Objective-C Generated Interface Header Name ). 이름은 다음과 같습니다MyModule-Swift.h

3 단계 : Test.m위의 헤더 를 가져 오는지 확인

#import "MyModule-Swift.h"

3

이 오류가 발생하는 클래스의 헤더 파일을 가져 왔는지 확인하십시오.


1

단위 분석법의 프로토 타입이 .h 파일에 있는지 확인하십시오.

파일을 정의하는 것보다 파일에서 더 높은 메소드를 호출하기 때문에이 메시지가 나타납니다. 또는 호출자가 호출 한 메소드보다 파일에서 더 낮도록 메소드를 재 배열 할 수 있습니다.


0

선언 및 / 또는 가져 오기에 문제가 있음을 나타내는 두 가지 관련 오류 메시지가 있습니다.

첫 번째는 당신이 참조하는 것이고, .h에 @class를 선언하면서 .m (또는 .pch 파일)에 #import를 넣지 않으면 생성 될 수 있습니다.

두 번째로 다음과 같이 States 클래스에 메소드가 있다면

- (void)logout:(NSTimer *)timer

#import를 추가하면 다음과 같습니다.

"States"에 대한 @interface가 표시기를 선택하지 않습니다. 'logout :'

이 메시지가 표시되면 가져 오거나 전달할 클래스의 .h 파일에서 "로그 아웃"메서드 (이 경우)를 선언했는지 확인하고 확인해야합니다.

따라서 귀하의 경우에는 다음이 필요합니다.

- (void)logout:(NSTimer *)timer;

이러한 관련 오류 중 하나 또는 둘 다를 사라지게하려면 States 클래스의 .h에서

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.