CFDataRef 和 NSData 是免费桥接的。这意味着,您可以将 NSData 实例传递到代码中,期望 CFData。
NSData 是一个类簇。这意味着,您可以对其进行子类化,并仅实现原始方法和初始化程序。对于NSData 原始方法是:
@property (readonly) NSUInteger length;
@property (readonly) const void *bytes NS_RETURNS_INNER_POINTER;
您还必须实现一些 init... 方法,该方法将初始化您的实例。
所有其他NSData 功能均按类别提供。您仍然可以覆盖任何方法并提供您自己的实现。
作为一种选择,您可以从NSData 子类开始,它将任何方法委托给内部NSData 实例,您可以将其存储在属性中。通过这种方式,您可以观察 3rd 方代码行为并调查您需要覆盖哪些方法。
不过,您需要很大的运气才能实现您想要的。但有可能。
例如,我创建了以下虚拟NSData 子类:
@interface MyData : NSData
@property (nonatomic, strong) NSData *innerData;
@end
@implementation MyData
- (id)initWithData:(NSData *)data {
if (self = [super init]) {
_innerData = data;
}
return self;
}
- (NSUInteger)length {
NSLog(@"%@", NSStringFromSelector(_cmd));
return self.innerData.length;
}
- (const void *)bytes {
NSLog(@"%@", NSStringFromSelector(_cmd));
return self.innerData.bytes;
}
@end
当我调用以下代码时:
NSData *originalData = [NSData dataWithBytes:"hello" length:5];
MyData *myData = [[MyData alloc] initWithData:originalData];
NSLog(@"%ld", CFDataGetLength((CFDataRef)myData));
length 我的子类的方法被调用。