1

オブジェクトを取る API を使用してCFDataおり、その場でデータを生成する必要がありますが、これは時間のかかる操作です。はCFDataランダムで非連続な方法でコンシューマによって読み取られ、データ全体の長さを実際に必要とすることはめったにありません。データの特定のランダムな断片が必要なだけです。

消費者が要求したビットのみを実際に生成することで、パフォーマンスを向上させたいと考えています。

データチャンクが読み込まれているときにコールバックを取得してその場で生成するようにCFData/をサブクラス化する方法はありますか?NSData

更新:残念ながら、消費者はサード パーティのコードであるため、魔法のように と互換性がない限り、他のクラスはオプションではありませんCFData

4

3 に答える 3

0

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

于 2016-09-21T19:35:09.590 に答える
0

あなたがここで得た答えを気に入るとは思えません。あなたはオプションに関して追い詰められているようです。

あなたの状況について私たちが知っていること

  1. クライアントのコードは異なるタイプ/クラスを受け入れることができません
  2. CFDataCoreFoundation C タイプであり、実行するランタイムがありません
  3. クライアントはおそらく CoreFoundation シンボルを使用してこのデータを読み取ります
    1. 運が良ければ、ランタイムを持つ Obj-C の Foundation API を使用します。
  4. CFDataa をデータにラップしますが、プロキシ オブジェクトvoid *を作成しようとした場合に模倣するのが難しい、先頭にいくらかのパディング (構造体の可能性があります) があります。CFData

巧妙で、メンテナンスが不可能で、全体的に危険なシンボル ハッカーがなければ、目的を達成することは非常に難しくなります。

于 2016-09-21T19:00:40.257 に答える
0

おそらく、次のようなものが必要な場合がありますNSInputStream

NSInputStream は、読み取り専用のストリーム機能を提供する NSStream のサブクラスです。

NSInputStream は、対応する Core Foundation の CFReadStreamRef と「無料でブリッジ」されています。無料のブリッジングの詳細については、「無料のブリッジング」を参照してください。

サブクラス化の注意事項

NSInputStream は、ストリーム データへの標準的な読み取り専用アクセスを提供する NSStream の具象サブクラスで構成されるクラス クラスタの抽象スーパークラスです。ストリーム データへのアクセスが必要なほとんどの状況では、おそらく NSInputStream で十分ですが、より特殊な動作が必要な場合 (たとえば、ストリーム内のデータに関する統計を記録する場合) は、NSInputStream のサブクラスを作成できます。

于 2016-06-04T23:15:30.663 に答える