'无法识别的选择器发送到实例'?

时间:2012-08-31 11:02:37

标签: objective-c ios xcode

我是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 个答案:

答案 0 :(得分:2)

在代码中插入一个断点并逐步执行它,你会看到它确切的断点。

您可能还想通过查看这些文件的目标成员资格来检查DDData文件是否正确包含在项目中,应该勾选.m。

答案 1 :(得分:2)

SimonH在其中一个子评论中正确指出了解决方案。我在NSData类别中定义的自定义方法遇到了同样的问题。解决方案更好地解释了:

  • 确保.m文件包含在项目Build Phases-&gt; Compile Sources中。
  • 右键单击项目导航器中的.m文件,然后单击“显示文件检查器”。在文件检查器下,确保检查您正在构建的目标,否则它将不会被包含,并且调用该方法将崩溃。

答案 2 :(得分:1)

如果尝试对对象执行未定义的方法,则会收到此类消息。试试这样:

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

据我所知,没有base64Decoded方法,但有base64EncodedString。因此,当您将base64Decoded消息发送到NSData对象时,它无法识别,因为它根本就不存在。

答案 3 :(得分: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]];
             }
    }