0

我是 Objective C 的新手,无法理解为什么会出现此错误。我检查了其他类似的问题,但无法解决问题。

错误是“-[NSConcreteMutableData base64Decoded]: unrecognized selector sent to instance 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 在其中一个子评论中正确指出了解决方案。我在 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 回答