【问题标题】:unrecognized selector with category NSMutableData类别为 NSMutableData 的无法识别的选择器
【发布时间】:2011-03-11 06:57:03
【问题描述】:

我正在向 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) 建议该文件未链接,这是不可能的,因为该文件中定义的其他类别都可以正常使用。

谢谢

【问题讨论】:

    标签: objective-c


    【解决方案1】:

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

    【讨论】:

    • 这为我找到了解决我面临的问题的正确方向……我忘记将类别添加到我的测试目标中,因此我的测试失败了。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多