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的实例。
答案 0 :(得分:0)
我有一个需要验证的假设。在syslog中,您有以下错误:
-[__NSCFString sha1]: unrecognized selector sent to instance 0x12ee1caf0
看起来您的方法sha1未找到并导致崩溃。怎么会发生?编译器用一些表示常量字符串的内部对象替换@"A string (but not this one)"
的对象,并且没有为此特定常量字符串类型定义的类别方法。
以下是我建议用于验证和修复假设的工作流程:
[NSString withString: @"your string"]
到超级编译器这实际上是一些证明,我的假设是关于通过常量表示编译时替换字符串 - What is the different between NSCFString and NSConstantString?
答案 1 :(得分:0)
示例代码,一个简单的自包含方法,只需将其添加到您的类中:
Test
测试(假设该方法属于班级NSString *hashHexASCII = [Test sha1:@"test String"];
NSLog(@"hashHexASCII: %@", hashHexASCII);
。
GET
输出:
hashHexASCII:9269ca2a6a1695eff8d5acd47b57c045698e3ce1