如何子类化NSMutableData

时间:2015-06-04 14:52:22

标签: 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:]!'"

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

2 个答案:

答案 0 :(得分:3)

NSDataNSMutableData是类群集的一部分。这意味着在子类化时需要做更多工作以确保子类完全有效。

换句话说,不要继承...

使用类别,包装器或帮助程序/实用程序类,您可以更轻松地执行所需操作。最好的选择可能是一个包装器,可以直接返回内部数据或指定数据范围。

答案 1 :(得分:1)

这需要一个类别。但是,默认情况下,类别不能具有属性和实例变量。因此,您需要#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