ios - 如何子类化NSMutableData

标签 ios objective-c nsmutabledata

我正在尝试对NSMutableData进行子类化,以在不复制的情况下为子数据添加功能。这是代码

@interface myMutableData : NSMutableData

- (NSData *)subdataWithNoCopyingAtRange:(NSRange)range;

@end

@interface myMutableData()

@property (nonatomic, strong) NSData *parent;

@end

@implementation myMutableData

- (NSData *)subdataWithNoCopyingAtRange:(NSRange)range
{
    unsigned char *dataPtr = (unsigned char *)[self bytes] + range.location;

    myMutableData *data = [[myMutableData alloc]     initWithBytesNoCopy:dataPtr length:range.length freeWhenDone:NO];

    data.parent = self;

    return data;
}

@end

但是问题是当我尝试实例化myMutableData时,出现了此错误
"-initWithCapacity: only defined for abstract class.  Define -[myMutableData initWithCapacity:]!'"

为什么?那么继承不起作用?谢谢

最佳答案

这需要一个类别。但是,类别默认情况下不能具有属性和实例变量。因此,您需要#import <objc/runtime.h>并使用关联的对象来获取和设置parent的值。

@interface NSMutableData(myMutableData)

- (NSData *)subdataWithNoCopyingAtRange:(NSRange)range;

@property (nonatomic, strong) NSData *parent;

@end

@implementation NSMutableData(myMutableData)

- (NSData *)subdataWithNoCopyingAtRange:(NSRange)range
{
    unsigned char *dataPtr = (unsigned char *)[self bytes] + range.location;

    NSMutableData *data = [[NSMutableData alloc]     initWithBytesNoCopy:dataPtr length:range.length freeWhenDone:NO];
    data.parent = self;
    return data;
}

-(NSData*)parent
{
    return objc_getAssociatedObject(self, @selector(parent));
}

-(void)setParent:(NSData *)parent
{
    objc_setAssociatedObject(self, @selector(parent), parent, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end

关于ios - 如何子类化NSMutableData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30647210/

相关文章:

iphone - 获取 UIView 类型

iphone - 亚马逊 S3 (AWS) NSMutableData

nsdata - iPhone 中 NSData 和 NSMutableData 的区别

ios - 将光标设置到 UITextView 内的开头

iphone - 即使重新加载表格后文本的颜色也不会改变

ios - 您可以从一个类发送消息以触发另一个类中的 'self' 吗?

iphone - 将 nsdata 对象组合成 nsmutabledata 对象

ios - Cordova iOS 应用程序哪个是正确的 www 文件夹?

ios - 如何有效地将 SKS 中的子节点与场景中的代码链接起来

objective-c - 在 CocoaPods post_install 步骤中运行 bash 命令