无法识别的选择器,类别为NSMutableData

时间:2011-03-11 06:57:04

标签: objective-c

我正在向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)表明该文件未链接,这是不可能的,因为此文件中定义的其他类别使用得很好。

由于

2 个答案:

答案 0 :(得分:6)

Ookay。我有同样的问题,但结果不同。简而言之,问题出在我的项目文件中。类别文件显示在项目导航器中 - 我可以加载/编辑等。但链接器不知道链接它们。我发现这个的方式是拉另一个线程 - 在我的类别文件中创建一个伪具体类来强制链接器包含它们。没运气。然后我尝试在我的应用程序中实例化一个虚拟类的实例。尤里卡 - 我现在收到链接器错误!所以,我只是将类别文件删除并重新添加到项目中,现在一切都很顺利。不确定项目文件是如何摆脱whack(svn merge?)的,但确实如此。

答案 1 :(得分:5)

删除类别文件并再次添加它们以检查目标。 解决了我。