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”来解决问题。

你有没有#importinput你的类别的头文件? 我知道这听起来很简单,但我几乎每次都忘记了。

碳发射器上有关于处理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”文件添加到编译源文件中。 然后你清理你的项目并运行。 我想这可能会有所帮助。