无法识别的选择器不会出现在源代码中导致崩溃

时间:2015-06-29 21:29:32

标签: ios objective-c theos

NSString+sha1.h的内容:

#include <CommonCrypto/CommonDigest.h>
#include <Foundation/Foundation.h>

@interface NSString (sha1)

- (NSString *) sha1;

@end

NSString+sha1.m的内容:

#include "NSString+sha1.h"

@implementation NSString (sha1)

- (NSString *) sha1 {
    const char *cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:input.length];

    uint8_t digest[CC_SHA1_DIGEST_LENGTH];

    CC_SHA1(data.bytes, data.length, digest);

    NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];

    for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", digest[i]];

    return [NSString stringWithString:output];
}

@end

UIImage+RenderBatteryImage.m的内容:

#include "UIImage+RenderBatteryImage.h"
#include "NSString+sha1.h"
[...]
[@"A string (but not this one)" sha1]

当第三个文件的代码运行时,我收到此错误:

-[__NSCFString sha1]: unrecognized selector sent to instance 0x12ee1caf0

造成这种情况的原因是什么?我可以确认在我的任何源文件中都没有大写SHA1的实例。

2 个答案:

答案 0 :(得分:0)

我有一个需要验证的假设。在syslog中,您有以下错误:

-[__NSCFString sha1]: unrecognized selector sent to instance 0x12ee1caf0

看起来您的方法sha1未找到并导致崩溃。怎么会发生?编译器用一些表示常量字符串的内部对象替换@"A string (but not this one)"的对象,并且没有为此特定常量字符串类型定义的类别方法。

以下是我建议用于验证和修复假设的工作流程:

  1. 注释掉你执行sha1调用的字符串并检查错误是否发生
  2. 将文字替换为实际对象[NSString withString: @"your string"]到超级编译器
  3. 这实际上是一些证明,我的假设是关于通过常量表示编译时替换字符串 - What is the different between NSCFString and NSConstantString?

答案 1 :(得分:0)

示例代码,一个简单的自包含方法,只需将其添加到您的类中:

Test

测试(假设该方法属于班级NSString *hashHexASCII = [Test sha1:@"test String"]; NSLog(@"hashHexASCII: %@", hashHexASCII);

GET

输出:

  

hashHexASCII:9269ca2a6a1695eff8d5acd47b57c045698e3ce1