1

サーバーに渡すコマンドを追跡するために、NSInputStreamとNSOutputStreamをサブクラス化しようとしています。このようにして、サーバーから応答を受信すると、それがどのコマンドに応答したかがわかります。サブクラスにコマンド文字列を設定しようとすると、認識できないセレクターエラーが発生します。

サブクラス:

PCFInputStream.h

#import <Foundation/Foundation.h>

@interface PCFInputStream : NSInputStream
@property (nonatomic, strong) NSString *command;
@end

PCFOutputStream.h

#import <Foundation/Foundation.h>

@interface PCFOutputStream : NSOutputStream
@property (nonatomic, strong) NSString *command;
@end

.mファイルにはコマンドプロパティが合成されているだけなので、setCommandを呼び出すことができます。

これが私がこれらを使用しているクラスです:

 //instance vars in my class
 PCFInputStream *inputStream;
 PCFOutputStream *outputStream;


-(void)followClass:(id)sender
{
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef) SERVER_ADDRESS, PORT,     &readStream, &writeStream);
    inputStream = (__bridge_transfer PCFInputStream *)readStream;
    outputStream = (__bridge_transfer PCFOutputStream *)writeStream;
    [inputStream setDelegate:self];
    [outputStream setDelegate:self];
    [inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
    [inputStream setCommand:[NSString stringWithFormat:@"%d,%@",[sender tag], [class classTitle]]];
    [inputStream open];
    NSString *str = [NSString stringWithFormat:@"_ADD_CLASS*%@*%@*%@*%@;", [class CRN], deviceToken, [class classLink],[class courseNumber]];
    [outputStream setCommand:str];
    [outputStream open];
}

これがラインを実行するときに私が得るエラーです

[inputStream setCommand:[NSString stringWithFormat:@"%d,%@",[sender tag], [class classTitle]]];

-[__NSCFInputStream setCommand:]: unrecognized selector sent to instance 0x1e691170
2012-12-01 21:56:20.777 PCF[15610:907] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFInputStream setCommand:]: unrecognized selector sent to instance 0x1e691170'
*** First throw call stack:
(0x3a1b73e7 0x39043963 0x3a1baf31 0x3a1b964d 0x3a111208 0xfa267 0x39585047 0x39584ffb 0x39584fd5 0x3958488b 0x39584d79 0x394a3441 0x3a18c941 0x3a18ac39 0x3a18af93 0x3a0fe23d 0x3a0fe0c9 0x3743733b 0x394ee291 0x100005 0xe7d48)
libc++abi.dylib: terminate called throwing an exception

誰かが私のために簡単な解決策を提案できますか?NSStreamInputインスタンスとNSString*コマンドを別のクラスにラップしようとしましたが、それは私の目的では機能しません。

ありがとう!

4

2 に答える 2

3

にをキャストすることはできませNSInputStreamPCFInputStream。オブジェクトはとして作成する必要がありPCFInputStream、それは行いCFStreamCReatePairWithSocketToHostません。

関連付けられたオブジェクトを使用して、カテゴリ内のcommandプロパティをアタッチすることができます。カテゴリインターフェイスは次のとおりです。NSInputStream

@interface NSInputStream (PCFCommand)
@property (nonatomic) NSString *pcf_command;
@end

次のように実装します。

#import <objc/runtime.h>

@implementation NSInputStream (PCFCommand)

static int kPCFCommandKey;

- (NSString *)pcf_command {
    return objc_getAssociatedObject(self, &kPCFCommandKey);
}

- (void)setPcf_command:(NSString *)pcf_command {
    objc_setAssociatedObject(self, &kPCFCommandKey, [pcf_command copy],
        OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end
于 2012-12-02T03:57:48.450 に答える
1

CFStreamCreatePairWithSocketToHostとを作成しCFWriteStreamますCFReadStreamNSOutputStreamそれらは、それぞれとで無料でブリッジされNSInputStreamます。したがって、返されるのはNSOutputStreamNSInputStreamです。それらのサブクラスを宣言したかどうかに関係なく、違いはありません。それらはCFStreamCreatePairWithSocketToHost作成するクラスです。

なんらかの理由で本当にラッピングを使用できない場合は、CoreFoundation関数を再実装してカスタムサブクラスを作成する必要があります。実際には、元のオブジェクトの1つが受け入れられる場所であればどこにでもラッパーを提供できるように、をラップしNS[Output/Input]Streamて使用することをお勧めします。forwardingTargetForSelector:

于 2012-12-02T03:07:02.123 に答える