2012-08-31 3 views
0

나는 Objective C를 처음 접했고 왜이 오류가 발생하는지 이해하는 데 어려움이 있습니다. 다른 유사한 질문을 확인했지만 문제를 해결할 수 없었습니다.'인식 할 수없는 셀렉터가 인스턴스로 전송되었습니다'?

는 오류입니다 "- [NSConcreteMutableData base64Decoded] : 인식 할 수없는 선택 예를 0x6e15610로 전송"

여기 base64Decoded에 대한 호출이 충돌의 원인이되는 문제 코드의 조각이다.

#import "DDData.h" 

- (NSString *)decodeBase64:(NSString *)input 
{ 
    NSData* dataDecoded = [[input dataUsingEncoding:NSUTF8StringEncoding] base64Decoded];  
    return [NSString stringWithUTF8String:[dataDecoded bytes]]; 
} 

그리고 DDData.h에서

:

#import <Foundation/Foundation.h> 

@interface NSData (DDData) 

- (NSData *)base64Decoded; 

@end 

및 DDData.m : 프로젝트는 ARC를 사용할 것을

@implementation NSData (DDData) 

- (NSData *)base64Decoded 
{ 
    // Excluding function code, as it never gets to here 
} 

@end 

그냥 참고. 여기에 어떤 문제가 있을지에 대한 아이디어가 있습니까? 감사.

편집 : 오류를 디버깅하는 데 도움이 위의 코드를 조정 한 :

NSData* dataDecoded = [input dataUsingEncoding:NSUTF8StringEncoding]; 
[dataDecoded base64Decoded]; 

dataDecoded는 dataUsingEncoding에서 값을 가져옵니다 base64Decoded에 대한 호출이 이루어질 때이 전무 없습니다. base64Decoded 호출로 넘어 가면 충돌이 발생합니다.

+0

[input dataUsingEncoding : NSUTF8StringEncoding]도 입력 할 수 없으므로 nil이됩니다. 그래서 nil logs error에서 수행 된 함수 –

+0

'NSConcreteMutableData' 클래스의 헤더 파일'.h'은 무엇을 말합니까? '-base64Decoded'와 같은 선택자가 있습니까? 그것은 당신에게 예외를 던진 것 같기 때문입니다. – holex

+0

@Prince 내가 분명히하기 위해 내 게시물을 편집했습니다. base64Decoded로 전송 된 데이터가 nil이 아닙니다. – Benzino

답변

1

개체에서 정의되지 않은 메서드를 실행하려고하면 이러한 종류의 메시지가 나타납니다. 이런 식으로 시도 :

NSData *dataDecoded = [[input dataUsingEncoding:NSUTF8StringEncoding] base64EncodedString]; 

은 내가 아는 한에는 base64Decoded 방법이 없지만, base64EncodedString이 있습니다. 그래서 NSData 객체에 base64Decoded 메시지를 보내면 단순히 존재하지 않기 때문에 인식되지 않습니다.

+1

을 추가하고 클래스를 사용하여 클래스 ** NSData **에 _base64Decoded_ 메소드를 추가했습니다. –

2

코드에 중단 점을 삽입하고 단계별로 실행하면 중단되는 부분이 정확히 표시됩니다.

DDData 파일이 해당 파일의 대상 구성원을보고 프로젝트에 제대로 포함되어 있는지 확인하고 싶을 수도 있습니다. .m을 눌러야합니다.

+0

이에 관한 원래 게시물을 업데이트했습니다. 그것은 Base64Decoded에 대한 호출에 도달 할 때 충돌이 발생하고 dataUsingEncoding이 nil을 반환하지 않음을 확인할 수 있습니다. 또한 파일이 프로젝트에 포함되어 있는지 확인했습니다. 도움을 주셔서 감사합니다! – Benzino

+1

파일 대상 멤버십을 확인 했습니까? 프로젝트에 포함 된 파일과 동일한 질문으로 들릴 수도 있지만 그렇지는 않습니다. 그냥 확인하고 싶다면, 사과 먹는다면 계란을 빨아 먹으라고 가르치는 것처럼 들리 네요. 위 소스 코드에 – AppHandwerker

0

아래의 디버깅 단계를 따르면이를 해결할 수 있습니다.

  1. 코드에 중단 점을 넣고 중단되는 위치를 단계별로 확인하십시오.
  2. 또한 프로젝트 타겟에 DDData.m 소스 파일을 올바르게 추가했는지 확인하십시오.
  3. 사용하기 전에 개체 존재를 확인해야합니다. 아래 샘플 코드를 확인하십시오.

    - (NSString *)decodeBase64:(NSString *)input { 
        if(input) { 
         NSData *utfData = [input dataUsingEncoding:NSUTF8StringEncoding]; 
         if(utfDFata) { 
          NSData* dataDecoded = [utfDFata base64Decoded];  
          return [NSString stringWithUTF8String:[dataDecoded bytes]]; 
         } 
    } 
    
2

는 SimonH는 하위 코멘트 하나의 솔루션을 올바르게 지적했다. NSData 범주에 정의 된 사용자 지정 메서드로 동일한 문제가있었습니다. 해결책은 다음과 같습니다.

  • 빌드 단계 -> 소스 컴파일에 .m 파일이 포함되어 있는지 확인하십시오.
  • 프로젝트 탐색기에서 .m 파일을 마우스 오른쪽 버튼으로 클릭하고 "파일 검사기 표시"를 클릭하십시오.File Inspector 아래에서 빌드 대상을 확인하십시오. 그렇지 않으면 포함되지 않을 것이며 해당 메서드가 충돌 할 것입니다.
관련 문제