Objective-C中的类别不起作用
我正在开发一个需要部署到iOS 3.1.3的iOS应用程序。 我需要扩展NSData类的一些function,并在NSData + Base64中使用以下代码(截断以显示有趣的部分):
的NSData + Base64.h
[...] @interface NSData (Base64) + (NSData *)dataFromBase64String:(NSString *)aString; - (NSString *)base64EncodedString; @end
的NSData + Base64.m
@implementation NSData (Base64) [...] // // base64EncodedString // // Creates an NSString object that contains the base 64 encoding of the // receiver's data. Lines are broken at 64 characters long. // // returns an autoreleased NSString being the base 64 representation of the // receiver. // - (NSString *)base64EncodedString { size_t outputLength; char *outputBuffer = NewBase64Encode([self bytes], [self length], true, &outputLength); NSString *result = [[[NSString alloc] initWithBytes:outputBuffer length:outputLength encoding:NSASCIIStringEncoding] autorelease]; free(outputBuffer); return result; } @end
但是,当我试图给这个select器发送消息时:
NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)]; NSString *hash = [HMAC base64EncodedString];
我得到以下错误:
-[NSConcreteData base64EncodedString]: unrecognized selector sent to instance 0x6146e70 2010-11-09 13:44:41.443 SpringboardApplication[21318:40b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSConcreteData base64EncodedString]: unrecognized selector sent to instance 0x6146e70'
我读了很多有关类别问题的iOS 3.1.x。 我尝试添加标志-all_load
和-all_load
(分开和一起)无济于事。 我真的很感谢如何让这个select器的工作方向。
谢谢!
这看起来好像是你的类别没有被编译或链接到你使用的目标。 你应该确保NSData + Base64.m被标记为与它被使用的目标相同,通过获取这两个文件的信息并比较它们被分配的目标。
你可以执行一个testing,就是向NSData + Base64.m添加一条带有#error错误信息的行,当它到达那个文件时会导致构build失败。 喜欢这个:
#error We're now compiling NSData+Base64.m
然后查看并查看哪个目标无法编译。
我与ARC项目有相同的问题,它与非ARC模块有类别扩展链接。
通过在父ARC项目中添加“其他链接器标志:-all_load”来解决问题。
你有没有#import
input你的类别的头文件? 我知道这听起来很简单,但我几乎每次都忘记了。
碳发射器上有关于处理iOS类别的一个很棒的post。 它详细介绍了处理导入类别到您的项目的简单方法。
创build一个包含所有类别导入的文件,在本例中为Extensions.h
:
#import "NSDate+Formatting.h" #import "UIFonts+MyFonts.h" #import "UIViewController+Tourbot.h"
在AppName-Prefix.pch
添加导入你的文件:
#import <Availability.h> #ifndef __IPHONE_3_0 #warning "This project uses features only available in iPhone SDK 3.0 and later." #endif #ifdef __OBJC__ #import <UIKit/UIKit.h> #import <Foundation/Foundation.h> #import <QuartzCore/QuartzCore.h> #import <CoreText/CoreText.h> #import "Extensions.h" // Add import here #endif
在我的情况下,当我得到这个错误,我只是在编译资源中添加.m文件,它得到了工作。 这可以通过select目标项目 – >构build阶段 – >编译源来实现。 然后你点击左下方的+button。 在这种情况下,您可以将“NSData + Base64.m”文件添加到编译源文件中。 然后你清理你的项目并运行。 我想这可能会有所帮助。