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
私のサブクラスのメソッドが呼び出されます。