我使用的是一个接受CFData对象的API,我需要动态生成数据,这是一个耗时的操作。CFData是由使用者以一种随机的、非连续的方式读取的,它实际上很少需要整个数据的长度--它只需要某些随机的数据片段。
我只想通过实际生成用户所请求的比特来提高性能,因为它们是被请求的。
是否有任何方法可以子类CFData/NSData,以便在读取数据块并动态生成数据块时得到回调?
更新:不幸的是,使用者是第三方代码,所以其他类不是一个选项,除非它们神奇地与CFData兼容。
发布于 2016-09-21 19:00:40
我觉得你不会喜欢你在这里得到的答案。你似乎在选择上走投无路。
我们知道你的情况
CFData是CoreFoundation C-类型,没有运行时可玩CFData将一个void *封装到数据中,但是在开始时有一些填充(可能是一个结构),如果您试图创建一个CFData代理对象,就很难模仿它。如果没有一些聪明的、不可维护的、总体上危险的符号黑客行为,我甚至不会费心去进入,就很难完成你想要的东西。
发布于 2016-06-04 23:15:30
也许你想要的更像NSInputStream
NSInputStream是NSStream的子类,它提供只读流功能。 NSInputStream是“免费搭桥”与其核心基金对应,CFReadStreamRef。有关免费桥接的更多信息,请参见免费桥接。 子类注释 NSInputStream是由NSStream的具体子类组成的类集群的抽象超类,这些子类提供对流数据的标准只读访问。虽然对于大多数需要访问流数据的情况,NSInputStream可能已经足够了,但是如果您想要更专门的行为(例如,您希望在流中记录数据的统计信息),可以创建NSInputStream的子类。
发布于 2016-09-21 19:35:09
CFDataRef和NSData是免费的桥梁。这意味着,您可以将NSData实例传递到期望CFData的代码中。
NSData是一个类集群。这意味着,您可以将其子类化,并且只实现原始方法和初始化器。对于NSData原语方法,如下所示:
@property (readonly) NSUInteger length;
@property (readonly) const void *bytes NS_RETURNS_INNER_POINTER;您还必须实现一些init..。方法,它将初始化实例。
所有其他NSData功能都是按类别提供的。您仍然可以覆盖任何方法并提供自己的实现。
作为一个选项,您可以从NSData子类开始,该子类将将任何方法委托给内部NSData实例,您可以将该实例存储在属性中。通过这种方式,您可以观察第三方代码行为,并研究需要覆盖哪些方法。
不过,你需要很多运气才能实现你想要的。但这可能是可能的。
例如,我创建了以下虚拟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方法。
https://stackoverflow.com/questions/37635892
复制相似问题