[objective-c] Objective-C에서 “인식 할 수없는 선택기가 인스턴스로 전송되었습니다”오류

버튼을 만들고 해당 작업을 추가했지만 호출하자마자이 오류가 발생했습니다.

-[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance
 0x3d03ac0 2010-03-16 22:23:58.811
 Money[8056:207] *** Terminating app
 due to uncaught exception
 'NSInvalidArgumentException', reason:'*** -[NSCFDictionary numberButtonClick:]:  unrecognized selector sent to instance 0x3d03ac0'

이것은 내 코드입니다.

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        UIButton *numberButton = [UIButton buttonWithType:UIButtonTypeCustom];
        numberButton.frame = CGRectMake(10, 435, 46, 38);
        [numberButton setImage:[UIImage imageNamed:@"one.png"] forState:UIControlStateNormal];
        [numberButton addTarget:self action:@selector(numberButtonClick:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview: numberButton];
    }
return self;
}

-(IBAction)numberButtonClick:(id)sender{
    NSLog(@"---");
}



답변

뷰 컨트롤러를 올바르게 관리하는 메모리가 아니며 어느 시점에서 할당이 해제되는 것처럼 보입니다. 이는 numberButtonClicked:뷰 컨트롤러가 이전에 차지했던 메모리를 차지하는 다른 객체로 메소드가 전송되도록합니다 …

뷰 컨트롤러를 올바르게 유지 / 해제해야합니다.


답변

내가했던 것처럼 Google을 통해 여기에 오는 사람들에게는 아마도 ARC의 Xcode 4.2 + / iOS 5 이상에 더 관련이 있습니다. ” 인식 할 수없는 선택기가 인스턴스로 전송되었습니다 “와 동일한 오류가 발생했습니다 . 필자의 경우 UIButton의 대상 작업을 발신자 매개 변수로 전달하도록 설정했지만 나중에 필요하지 않고 코드에서 제거했습니다. 따라서 다음과 같은 것이 있습니다.

- (IBAction)buttonPressed:(UIButton *)sender {

로 변경되었습니다 :

- (IBAction)buttonPressed {

문제의 UIButton을 마우스 오른쪽 버튼으로 클릭하면 Touch Up Inside 이벤트가 뷰 컨트롤러 buttonPressed : 메서드와 관련이 있음을 보여주었습니다. 이것을 제거하고 수정 된 메소드에 다시 할당하면 대우를했습니다.


답변

이것은이 문제에 대한 Google의 최고 답변이지만 다른 원인 / 결과가있었습니다. 다른 사람들 이이 문제를 우연히 발견 할 경우 2 센트를 더할 것이라고 생각했습니다.

오늘 아침에 비슷한 문제가 발생했습니다. 문제를 제공하는 UI 항목을 마우스 오른쪽 버튼으로 클릭하면 어떤 연결이 생성되었는지 확인할 수 있습니다. 제 경우에는 두 가지 동작으로 연결된 버튼이 있습니다. 마우스 오른쪽 버튼 클릭 메뉴에서 작업을 삭제하고 다시 연결하여 문제를 해결했습니다.

따라서 작업이 올바르게 연결되어 있는지 확인하십시오.


답변

좋아, 나는 여기에 칩을 넣어야한다. OP 는 버튼을 동적으로 만들었습니다 . 나는 비슷한 문제를 겪었고 대답 (헌팅 시간 후)이 너무 단순하여 나를 아프게했습니다.

사용할 때:

action:@selector(xxxButtonClick:)

or (as in my case)

action:NSSelectorFromString([[NSString alloc] initWithFormat:@"%@BtnTui:", name.lowercaseString])

문자열 끝에 콜론을 넣으면 발신자가 전달됩니다. 문자열의 끝에 콜론을 배치하지 않으면 콜론이 발생하지 않으며 수신자는 콜론을 예상 할 경우 오류가 발생합니다. 이벤트 이름을 동적으로 작성하는 경우 콜론을 놓치기 쉽습니다.

수신자 코드 옵션은 다음과 같습니다.

- (void)doneBtnTui:(id)sender {
  NSLog(@"Done Button - with sender");
}
 or
- (void)doneBtnTui {
  NSLog(@"Done Button - no sender");
}

평소와 같이 항상 놓치는 것은 분명한 대답입니다.


답변

필자의 경우 함수는 인수를 기대하지 않았지만 버튼은 오류를 발생시키는 버튼을 보내도록 구성되었습니다. 이 문제를 해결하려면 이벤트 처리기를 다시 연결해야했습니다.

내 기능은 다음과 같습니다.

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

인수가 포함되어 있지 않습니다.

내 버튼 구성 이미지는 다음과 같습니다 (버튼을 마우스 오른쪽 버튼으로 클릭하면 볼 수 있음).

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

3 개의 이벤트 핸들러가 있습니다.

이 문제를 해결하려면 각 이벤트 항목 중 하나가 enterPressed 함수에 대한 참조를 전송했기 때문에 각 이벤트 항목을 제거해야했습니다. 이 항목을 제거하려면 항목이 표시되지 않을 때까지 각 항목 이름 옆에있는 작은 x 아이콘을 클릭했습니다.

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

다음으로 버튼을 이벤트에 다시 연결해야했습니다. 이렇게하려면 Control 키를 누른 상태에서 단추에서 동작으로 선을 드래그하십시오. “연결 작업”이라고 표시되어야합니다. 참고 : 어떤 이유로 든 XCode를 다시 시작해야했습니다. 그렇지 않으면 함수 위 또는 아래에 액션 (일명 새 액션 만들기)을 삽입 할 수 있습니다.

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

이제 인수가없는 버튼 이벤트에 연결된 단일 이벤트 핸들러가 있어야합니다.

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

이 답변은 @Leonard Challis의 답변을 칭찬합니다.


답변

인터페이스 빌더에서보기의 “클래스”를 설정하지 않은 경우에도 발생할 수 있습니다.


답변

필자의 경우 NSNotificationCenter를 사용하고 인수는 없지만 콜론을 추가하는 선택기를 사용하려고했습니다. 콜론을 제거하면 문제가 해결되었습니다.

선택기 이름을 사용할 때 인수가 없으면 후미 콜론을 사용하지 마십시오. 하나의 인수가 있으면 하나의 후행 콜론을 사용하십시오. 인수가 둘 이상인 경우 각 인수마다 후행 콜론과 함께 이름을 지정해야합니다.

Adam Rosenfield의 답변을 참조하십시오 : Objective-C의 선택기?