programing

Objective-C에서 "instance로 전송된 인식되지 않는 선택기" 오류

lastcode 2023. 5. 27. 11:33
반응형

Objective-C에서 "instance로 전송된 인식되지 않는 선택기" 오류

단추를 만들고 해당 단추에 대한 작업을 추가했지만 실행되자마자 다음 오류가 발생했습니다.

-[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:보기 컨트롤러가 이전에 점유하고 있던 메모리를 현재 점유하고 있는 다른 개체로 보낼 메서드...

보기 컨트롤러를 올바르게 유지/해제했는지 확인합니다.

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

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

다음으로 변경됨:

- (IBAction)buttonPressed {

문제의 UIButton을 마우스 오른쪽 버튼으로 클릭하면 Touch Up Inside 이벤트가 view controllers buttonPressed: method와 연관되어 있음을 알 수 있습니다.이것을 제거하고 수정된 방법에 다시 할당하는 것은 효과가 있었습니다.

이것이 이 문제에 대한 구글의 최고 답변이었지만, 저는 다른 사람들이 이 문제를 발견할 경우를 대비해 제가 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 키를 누른 채로 버튼에서 작업으로 선을 끕니다."Connect Action"이라고 표시되어야 합니다.참고: 어떤 이유에서인지 XCode를 다시 시작해야 작동합니다. 그렇지 않으면 함수 위나 아래에 작업(새 작업 만들기)만 삽입할 수 있습니다.

여기에 이미지 설명 입력

이제 인수를 전달하지 않는 버튼 이벤트에 단일 이벤트 핸들러를 연결해야 합니다.

여기에 이미지 설명 입력

이 답변은 @Leonard Challis의 답변을 칭찬하며 여러분도 읽어야 합니다.

인터페이스 작성기에서 보기의 "클래스"를 설정하지 않은 경우에도 이 문제가 발생할 수 있습니다.

저의 경우 NSNotificationCenter를 사용하여 인수를 사용하지 않고 콜론을 추가하는 셀렉터를 사용하려고 했습니다.대장을 제거하면 문제가 해결됩니다.

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

여기에서 Adam Rosenfield의 답변을 참조하십시오: 목표-C의 선택기?

제가 버튼을 동적으로 만드는 Swift 프로젝트에서 이런 문제를 겪었습니다.문제 코드:

var trashBarButtonItem: UIBarButtonItem {
    return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked")
}

func newButtonClicked(barButtonItem: UIBarButtonItem) {
    NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
}

해결책은 다음과 같은 동작 뒤에 완전한 콜론 ':'을 추가하는 것이었습니다.

var trashBarButtonItem: UIBarButtonItem {
        return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked:")
    }

    func newButtonClicked(barButtonItem: UIBarButtonItem) {
        NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
    }

전체 예: https://developer.apple.com/library/content/samplecode/UICatalog/Listings/Swift_UIKitCatalog_DefaultToolbarViewController_swift.html

이것의 가장 명백한 원인은 포인터를 부적절하게 캐스팅하고 잘못된 클래스의 메서드를 호출하는 것입니다.

NSArray* array = [[NSArray alloc] init];
[(NSDictionary*)array objectForKey: key]; // array is not a dictionary, hence exception

저도 같은 문제가 있었습니다.

스토리보드에서 UI버튼을 삭제하고 다시 만들었습니다.이제 모든 것이 잘 작동합니다.

'인식할 수 없는 선택기 인스턴스로 보내기'를 디버깅하는 방법

대부분의 경우 Xcode는 이 문제가 발생하는 정확한 라인으로 이동하지 않습니다.앱이 충돌할 때 이를 유발한 코드 라인이 표시되지 않고 앱 대리자 클래스로 이동합니다. 여기서 오류 출력은 다음과 같습니다.

[UITableViewCellContentView image]: unrecognized selector sent to instance

또는

[__NSDictionaryI objectAtIndex:] unrecognized selector sent to instance

또는

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[TestApp.MyViewController viewDidLoad:]: unrecognized selector sent to instance 0xDABCDD'

원인이 되는 코드 라인을 찾는 방법:

중단점 탐색기로 이동합니다.'+' 옵션을 클릭합니다.'예외 중단점'을 클릭합니다.다음과 같은 새 위젯이 나타납니다.

여기에 이미지 설명 입력

다음 조건 블록을 추가합니다.

-[NSObject(NSObject) doesNotRecognizeSelector:]

여기에 이미지 설명 입력

모든 예외에 대해 중단점을 지정할 수도 있습니다.이제 코드를 다시 실행합니다.이 예외가 발생할 때 중단점이 트리거됩니다.

작성자: 프라풀라

전체 설명: https://prafullkumar77.medium.com/how-to-debug-unrecognized-selector-send-to-instance-402473bc23d

저도 비슷한 문제가 있었지만, 저에게는 해결책이 조금 달랐습니다.저의 경우 카테고리를 사용하여 기존 클래스(일부 크기 조정 기능은 UI 이미지 - 관심 있는 경우 이 방법 참조)를 확장하고 *.m 파일을 빌드 대상에 추가하는 것을 잊었습니다.바보 같은 실수지만, 어디를 봐야 할지 항상 명확한 것은 아닙니다.공유할 가치가 있다고 생각했어요

또 다른 가능한 해결책:링커 인수에 '-ObjC'를 추가합니다.

전체 설명은 여기에 있습니다: 정적 라이브러리의 목표-C 범주

제 생각에 요점은, 만약 당신이 정적으로 링크하고 있는 라이브러리에 카테고리가 정의되어 있다면, 링커는 카테고리 메소드를 링크할 만큼 똑똑하지 않다는 것입니다.위의 플래그는 소스 분석을 기반으로 해야 한다고 생각하는 것뿐만 아니라 모든 객관적인 C 클래스와 범주에 링커 링크를 만듭니다. (답변을 자유롭게 조정하거나 수정하십시오.)저는 연결된 언어에 익숙하기 때문에 여기서 앵무새처럼 행동하고 있습니다.)

@IBAction 함수를 실수로 지웠기 때문에 이 문제가 발생했습니다.내 UIView 컨트롤러 클래스 코드 안에서, 그래서 스토리보드에 레퍼런스 아웃렛이 만들어졌지만, 런타임에는 그것을 처리할 수 있는 기능이 있었습니다.

해결책은 속성 관리자 내부의 Outlet 참조를 삭제한 다음 클래스 코드에 대한 명령 키로 끌어다 다시 생성하는 것이었습니다.

도움이 되길 바랍니다!

반품 타입의 IBAaction 대신 void를 사용해야 한다고 생각합니다.버튼을 프로그래밍 방식으로 정의했기 때문입니다.

동일한 오류가 발생하여 다음을 발견했습니다.

코드를 사용할 때

[self.refreshControl addTarget:self action:@selector(yourRefreshMethod:) forControlEvents:UIControlEventValueChanged];

선택기를 찾고 있다고 생각할 수 있습니다.

- (void)yourRefreshMethod{
    (your code here)
}

하지만 실제로 선택자를 찾고 있습니다.

- (void)yourRefreshMethod:(id)sender{
    (your code here)
}

그 선택기는 존재하지 않습니다. 그래서 충돌이 발생합니다.

오류를 해결하기 위해 (id)발신자를 수신하도록 선택기를 변경할 수 있습니다.

하지만 발신자를 제공하지 않고 새로 고침 기능을 호출하는 다른 기능이 있다면 어떨까요?둘 다 작동하는 기능이 하나 필요합니다.쉬운 해결책은 다음과 같은 다른 기능을 추가하는 것입니다.

- (void)yourRefreshMethodWithSender:(id)sender{
    [self yourRefreshMethod];
}

그런 다음 새로 고침 풀다운 코드를 수정하여 대신 선택기를 호출합니다.

[self.refreshControl addTarget:self action:@selector(yourRefreshMethodWithSender:) forControlEvents:UIControlEventValueChanged];

저는 또한 Mac OS X의 최신 버전으로 업그레이드할 수 없는 오래된 Mac에서 Stanford iOS 과정을 밟고 있습니다.그래서 저는 여전히 iOS 6.1을 위해 빌드하고 있으며, 이것이 저의 문제를 해결했습니다.

나의 경우, 나는 2시간 후에 문제를 해결했습니다.

보낸 사람(탭바 항목)에 참조 아울렛이 없습니다.그래서 그것은 아무 것도 가리키지 않았습니다.

당신의 기능에 해당하는 참조 배출구를 만들어 주세요.

이것이 여러분에게 도움이 되길 바랍니다.

저는 현재 iOS 개발을 배우고 있으며, A 프레스의 "Begining iOS6 Development" 책을 읽고 있습니다.10장에서도 같은 오류가 발생했습니다.스토리보드.

이틀이 걸려서야 알아냈는데, 실수로 TableView 셀의 태그를 1로 설정했다는 것을 알게 되었습니다.이 책을 읽고 있는 다른 사람들에게도 이와 비슷한 오류가 있기를 바랍니다.

앞으로 내 코드의 오류를 더 쉽게 찾을 수 있기를 바랍니다!하하하.디버그 오류는 나를 그것을 이해하는 올바른 방향으로 밀어넣는 데 아무런 도움이 되지 않았습니다(또는 적어도 나는 디버거를 이해하기에는 너무 새로운 사람입니다, 하하).

저의 경우 UI WebView를 사용하다가 NSURL 대신 두 번째 매개 변수에 NSString을 전달했습니다.따라서 함수에 전달된 클래스 유형이 잘못되면 이 오류가 발생할 수 있다고 생각합니다.

..그리고 이제 나의 것.

다른 버튼의 매개 변수에 액세스하는 방법에 연결된 버튼이 있었는데, 작동이 잘 되었으나 버튼 자체를 사용하여 무언가를 하려고 하자마자 크래쉬가 발생했습니다.컴파일하는 동안 오류가 표시되지 않았습니다.해결책?

파일 소유자에게 단추를 연결하지 못했습니다.그래서 여기 있는 사람 중에 나처럼 바보 같은 사람이 있다면, 이것을 시도해 보세요.

또 다른 약간 다른 솔루션/사례.

저는 Xamarin과 MvmCross를 사용하고 있으며 UI 버튼을 View Model에 바인딩하려고 했습니다.UIButton을 콘센트와 TouchUp Inside에 연결했습니다.

바인딩할 때는 콘센트만 사용합니다.

set.Bind (somethingOutlet).For ("TouchUpInside").To(vm => vm.Something);

XCode에서 액션(TouchUpInside) 연결을 제거하기만 하면 문제가 해결되었습니다.

추신. 저는 이것이 모두 이전 답변들과 관련이 있다고 생각합니다. 특히 @Chris Kaminski와 관련이 있지만, 이것이 누군가에게 도움이 되기를 바랍니다.

건배.

저도 같은 문제가 있었습니다.문제는 하나의 버튼에 두 가지 Action 메서드가 있다는 것입니다.단추에 대한 첫 번째 작업 방법을 만든 다음 보기 컨트롤러에서 삭제했지만 연결 관리자의 메인 스토리보드에서 연결을 끊는 것을 잊었습니다.그래서 제가 두 번째 동작 방법을 추가했을 때, 하나의 버튼에 대해 두 가지 동작 방법이 있었고, 이것이 오류를 일으켰습니다.

저에게, 그것은 인터페이스 빌더 bij ctrl-draging에서 만들어진 남은 연결이었습니다.끊어진 연결의 이름이 오류 로그에 있습니다.

*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[NameOfYourApp.NameOfYourClass nameOfCorruptConnection:]:
unrecognized selector sent to instance 0x7f97a48bb000'

단추와 연결된 작업이 있었습니다.아웃렛이 내 코드에 더 이상 존재하지 않기 때문에 버튼을 누르면 앱이 다운됩니다.로그에서 이름을 찾으면서 스토리보드에서 이름을 찾았습니다.삭제했고, 충돌은 사라졌습니다!

저도 스탠퍼드 iOS C193P 수업을 듣고 있었고, 사용자 "oli206"도 듣고 있었기 때문에 Leonard Challis에게 답장합니다.

"'NSInvalidArgument' 예외로 인해 앱을 종료합니다.예외', 이유:"

문제는 계산기의 "Enter" 버튼을 두 번 연결한 것인데, 한 친구가 스토리보드의 버튼을 검사한 결과 "Enter" 버튼을 마우스 오른쪽 버튼으로 클릭했을 때 "Touch Up Inside" 속성에 2개의 항목이 있는 것으로 나타났다고 지적했습니다.두 개의 "Touch Up Inside" "Sent Events" 중 하나를 지우면 문제가 해결되었습니다.

이는 문제가 (할당 시 계산기 워크스루의 C193P 비디오 클래스의 경우) 2개의 전송 이벤트로 트리거되었으며, 그 중 하나가 예외를 유발했음을 보여줍니다.

이 문제는 인터페이스 작성기의 ViewControllerScene에 ViewController를 할당하지 않은 경우에 발생할 수 있습니다.따라서 ViewController.m은 어떤 장면에도 연결되어 있지 않습니다.

내 몫까지 포함해서요제가 ARC(Automatic Counting Reference)가 비활성화된 프로젝트를 만들 때까지 한동안 이 문제에 매달렸습니다.해당 옵션에 대한 빠른 설정으로 문제가 해결되었습니다.

이것의 또 다른 정말 어리석은 원인은 구현(m)(예: typo)이 아닌 인터페이스(.h)에 셀렉터가 정의되어 있다는 것입니다.

목록에 추가해야 하는 다른 이유/해결 방법.이 문제는 iOS 6.0(및/또는 잘못된 프로그래밍)으로 인해 발생합니다.이전 버전에서는 매개 변수 유형이 일치하면 선택기가 일치하지만 iOS 6.0에서는 이전에 작동하던 코드에서 매개 변수 이름이 올바르지 않은 충돌이 발생했습니다.

나는 뭔가를 하고 있었습니다.

[objectName methodName:@"somestring" lat:latValue lng:lngValue];

하지만 정의(.h와 .m 모두)에서 나는 가지고 있었습니다.

(viod) methodName:(NSString *) latitude:(double)latitude longitude:(double)longitude;

이것은 iOS5에서는 잘 작동했지만 6에서는 작동하지 않았고, 심지어 다른 기기에 배포된 동일한 빌드에서도 작동하지 않았습니다.

나는 왜 컴파일러가 나에게 이것을 말해주지 못했는지 이해할 수 없습니다. 문제가 해결되었습니다.

사용자 지정 컨트롤러 B 클래스 내에서 컨트롤러 A의 속성을 공용 속성으로 설정하려는 경우에도 스토리보드에서 ID 검사기 내부의 "사용자 지정 클래스"를 아직 설정하지 않은 경우에도 이 문제가 발생할 수 있습니다.

저의 문제와 해결책은 달랐고 미래의 독자들이 벽에 부딪히지 않도록 여기에 올려야겠다고 생각했습니다.

동일한 UIVIew Controller에 다른 xib를 할당하고 있었는데 모든 곳을 검색해도 수정 방법을 찾을 수 없었습니다. 나서 저는 앱 에게 전화를 에서 앱 했습니다.initWithNibName했는데, 하는 것을 알 수 .UIViewControllerclass. 여러분에게, 의 클입니다를 하세요. 그래서 만약 어떤 해결책도 당신에게 맞지 않는다면,initWithNibName방법.

언급URL : https://stackoverflow.com/questions/2455161/unrecognized-selector-sent-to-instance-error-in-objective-c

반응형