0

NSOutputStream の実際の書き込みが発生する前に、カスタム データを書き込む必要があります。

スウィズリング コードを実行するために、以下を含むカテゴリ NSOutputStream(SwizzleWrite) を作成しました。

SEL originalSelector = @selector(write:maxLength:);
SEL swizzledSelector = @selector(swizzledWrite:maxLength:);

Method originalMethod = class_getInstanceMethod([NSOutputStream class], originalSelector);
Method swizzledMethod = class_getInstanceMethod([self class], swizzledSelector);

method_exchangeImplementations(originalMethod, swizzledMethod);

次に、Inout & Output ストリームを作成します: CFStreamCreatePairWithSocketToCFHost(kCFAllocatorDefault, hostRef, 80, &readStream, &writeStream);

inputStream = (__bridge_transfer NSInputStream *)readStream;
outputStream = (__bridge_transfer NSOutputStream *)writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];

しかし今、コントロールが handleEvent: delegate に到達すると、具体的には[outputStream write:rawstring maxLength:sizeof(rawstring)];に達します。、私はswizzledWrite:maxLengthでそれを取得しません:

ここで何が間違っていますか?

PS: Apple のスウィズリング メソッドは Appstore に適していないことを読みましたが、それらが受け入れられているケースも読みました。

4

1 に答える 1

0

ここでスウィズルが最良の選択肢だと思うのはなぜですか? サブクラスの方がはるかに優れているように思えます。ストリームのサブクラス化にはいくつかの注意が必要な部分がありますが、こちらをご覧ください

スウィズルを機能させることに決めた場合は、ブレークポイントを設定し、スウィズル セレクターが nil でないことを確認しましたか? 署名を少し間違えると発生する可能性があります

于 2014-11-29T08:03:42.400 に答える