2012-08-31 24 views
0

我是新來的目標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:

@implementation NSData (DDData) 

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

@end 

只是說明該項目已啓用ARC。任何想法可能是這裏的問題?謝謝。

編輯:我已經調整了上面的代碼,以幫助調試錯誤:

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

dataDecoded從dataUsingEncoding得到的值,是由以base64Decoded通話時,它不是零。當我繼續調用base64Decoded時,它崩潰了。

+0

[輸入數據使用編碼:NSUTF8StringEncoding]變成零,因爲輸入也可能爲零。所以函數對nil日誌執行錯誤 –

+0

類「NSConcreteMutableData」的頭文件'.h'文件說什麼?它有像'-base64Decoded'這樣的選擇器嗎?因爲它似乎給你帶來了例外。 – holex

+0

@Pince我現在編輯我的帖子來澄清。發送到base64Decoded的數據不是零。 – Benzino

回答

1

如果您嘗試在對象上執行未定義的方法,您會得到那種消息。試着這樣說:

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

沒有base64Decoded方法,據我所知,但有base64EncodedString。所以當你發送base64Decoded消息到你的NSData對象時,它不會被識別,因爲它根本就不存在。

+1

在上面的源代碼中,使用類別添加了方法_base64Decoded_到類** NSData **。 –

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文件包含在項目Build Phases-> Compile Sources中。
  • 右鍵單擊項目導航器中的.m文件,然後單擊「顯示文件檢查器」。在File Inspector下,確保你檢查你正在構建的目標,否則它不會被包含,並且調用該方法將會崩潰。
相關問題