2012-08-31 25 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下,确保你检查你正在构建的目标,否则它不会被包含,并且调用该方法将会崩溃。
相关问题