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:

@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 の呼び出しが行われたときは nil ではありません。呼び出された base64Decoded にステップオーバーすると、クラッシュします。

4

4 に答える 4

2

コードにブレークポイントを挿入してステップスルーすると、ブレークポイントが正確に表示されます。

また、これらのファイルのターゲットメンバーシップを確認して、DDDataファイルがプロジェクトに適切に含まれていることを確認することもできます。.mにチェックマークを付ける必要があります。

于 2012-08-31T11:08:43.863 に答える
2

SimonH は、サブコメントの 1 つで解決策を正しく指摘しました。NSData カテゴリで定義したカスタム メソッドで同じ問題が発生していました。解決策はよりよく説明されています:

  • .m ファイルがプロジェクトの Build Phases->Compile Sources に含まれていることを確認してください。
  • プロジェクト ナビゲータで .m ファイルを右クリックし、[ファイル インスペクタを表示] をクリックします。File Inspector の下で、ビルドするターゲットを確認してください。そうしないと、ターゲットが含まれず、そのメソッドの呼び出しがクラッシュします。
于 2013-12-27T05:03:55.863 に答える
1

オブジェクトで未定義のメソッドを実行しようとすると、そのようなメッセージが表示されます。次のようにしてみてください。

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

私の知る限り、base64Decoded メソッドはありませんが、base64EncodedString はあります。そのため、base64Decoded メッセージを NSData オブジェクトに送信しても、存在しないため認識されません。

于 2012-08-31T11:10:08.737 に答える
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]];
             }
    }
    
于 2012-08-31T11:30:44.837 に答える