如何继承 NSMutableData
How to subclass 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:]!'"
为什么?那么继承行不通?谢谢
NSData
和 NSMutableData
是 class 集群的一部分。这意味着你需要在 subclassing 时做更多的工作,以确保你的 subclass 完全有效。
也就是说,不要subclass...
使用类别、包装器或帮助程序/实用程序,您可以更轻松地做您想做的事情 class。最好的选择可能是一个包装器,它可以 return 直接内部数据或指定范围的数据。
这需要一个类别。但是,默认情况下类别不能具有属性和实例变量。因此,您需要 #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
我正在尝试将 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:]!'"
为什么?那么继承行不通?谢谢
NSData
和 NSMutableData
是 class 集群的一部分。这意味着你需要在 subclassing 时做更多的工作,以确保你的 subclass 完全有效。
也就是说,不要subclass...
使用类别、包装器或帮助程序/实用程序,您可以更轻松地做您想做的事情 class。最好的选择可能是一个包装器,它可以 return 直接内部数据或指定范围的数据。
这需要一个类别。但是,默认情况下类别不能具有属性和实例变量。因此,您需要 #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