我正在向NSData添加一个类别,如下所示:
// PacketCategories.h
@interface NSData(PacketSplit)
- (NSArray *)splitTransferredPackets:(NSData **)leftover;
@end
// PacketCategories.m
@implementation NSData(PacketSplit)
- (NSArray *)splitTransferredPackets:(NSData **)leftover {
NSMutableArray *ret = [NSMutableArray array];
const unsigned char *beginning = [self bytes];
const unsigned char *offset = [self bytes];
NSInteger bytesEnd = (NSInteger)offset + [self length];
while ((NSInteger)offset < bytesEnd) {
uint64_t dataSize[1];
NSInteger dataSizeStart = offset - beginning;
NSInteger dataStart = dataSizeStart + sizeof(uint64_t);
NSRange headerRange = NSMakeRange(dataSizeStart, sizeof(uint64_t));
[self getBytes:dataSize range:headerRange];
if (dataStart + dataSize[0] + (NSInteger)offset > bytesEnd) {
NSInteger lengthOfRemainingData = [self length] - dataSizeStart;
NSRange dataRange = NSMakeRange(dataSizeStart, lengthOfRemainingData);
*leftover = [self subdataWithRange:dataRange];
return ret;
}
NSRange dataRange = NSMakeRange(dataStart, dataSize[0]);
NSData *parsedData = [self subdataWithRange:dataRange];
[ret addObject:parsedData];
offset = offset + dataSize[0] + sizeof(uint64_t);
}
return ret;
}
@end
然后尝试调用该类别:
#import "PacketCategories.h"
NSMutableData *data = [NSMutableData data];
// Read some data
[data appendBytes:buffer length:bytesRead];
NSArray *dataPackets = [data splitTransferredPackets:&readLeftover];
出现以下错误:
-[NSConcreteMutableData splitTransferredPackets:]: unrecognized selector sent to instance 0x6e6f7b0
[ERROR] The application has crashed with an unhandled exception. Stack trace:
有什么想法吗? NSConcreteMutableData是否不从NSData继承?
其他建议的答案(Objective-C Category Causing unrecognized selector)表明该文件未链接,这是不可能的,因为此文件中定义的其他类别使用得很好。
由于
答案 0 :(得分:6)
Ookay。我有同样的问题,但结果不同。简而言之,问题出在我的项目文件中。类别文件显示在项目导航器中 - 我可以加载/编辑等。但链接器不知道链接它们。我发现这个的方式是拉另一个线程 - 在我的类别文件中创建一个伪具体类来强制链接器包含它们。没运气。然后我尝试在我的应用程序中实例化一个虚拟类的实例。尤里卡 - 我现在收到链接器错误!所以,我只是将类别文件删除并重新添加到项目中,现在一切都很顺利。不确定项目文件是如何摆脱whack(svn merge?)的,但确实如此。
答案 1 :(得分:5)
删除类别文件并再次添加它们以检查目标。 解决了我。