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

Sco*_*rie 2 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
Run Code Online (Sandbox Code Playgroud)

然后尝试调用该类别:

#import "PacketCategories.h"

NSMutableData *data = [NSMutableData data];
// Read some data
[data appendBytes:buffer length:bytesRead];
NSArray *dataPackets = [data splitTransferredPackets:&readLeftover];
Run Code Online (Sandbox Code Playgroud)

这会得到以下错误:

-[NSConcreteMutableData splitTransferredPackets:]: unrecognized selector sent to instance 0x6e6f7b0 [ERROR] The application has crashed with an unhandled exception. Stack trace:

有任何想法吗?NSConcreteMutableData是否不从NSData继承?

其他建议的答案(Objective-C类别导致无法识别的选择器)已建议文件未链接,这是不可能的,因为此文件中定义的其他类别使用得很好.

谢谢

sve*_*son 6

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


小智 5

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