0

これは、「CFsocket」を実装するための CoCoa の ViewController.h の私のコードです。

@interface ViewController : NSViewController
-(IBAction)start:(id)sender;
@property (strong, nonatomic) IBOutlet NSTextView  *CommandDisplay;

これはViewController.mです

@implementation ViewController
@synthesize CommandDisplay=_CommandDisplay;

void AcceptCallBack(CFSocketRef socket,CFSocketCallBackType type,CFDataRef address,const void *data,void *info)
{
CFReadStreamRef readStream = NULL;
CFWriteStreamRef writeStream = NULL;
// For a kCFSocketConnectCallBack that failed in the background, it is a pointer to an SInt32 error code; for a kCFSocketAcceptCallBack, it is a pointer to a CFSocketNativeHandle; or for a kCFSocketDataCallBack, it is a CFData object containing the incoming data. In all other cases, it is NULL.
CFSocketNativeHandle sock = *(CFSocketNativeHandle *) data;
CFStreamCreatePairWithSocket(kCFAllocatorDefault, sock, &readStream, &writeStream);


if (!readStream || !writeStream)
{
    close(sock);
    NSLog(@"CFStreamCreatePairWithSocket()Fail");
    return;
}

CFStreamClientContext streamCtxt = {0, NULL, NULL, NULL, NULL};
CFReadStreamSetClient(readStream, kCFStreamEventHasBytesAvailable, ReadStreamClientCallBack, &streamCtxt);
CFWriteStreamSetClient(writeStream, kCFStreamEventCanAcceptBytes, WriteStreamClientCallBack, &streamCtxt);

CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetCurrent(),kCFRunLoopCommonModes);
CFWriteStreamScheduleWithRunLoop(writeStream, CFRunLoopGetCurrent(),kCFRunLoopCommonModes);

CFReadStreamOpen(readStream);
CFWriteStreamOpen(writeStream);
}

// readstream operatoion , use when client transmitted data
 void ReadStreamClientCallBack(CFReadStreamRef stream, CFStreamEventType eventType, void* clientCallBackInfo)
{
UInt8 buff[255];
CFReadStreamRef inputStream = stream;
CFReadStreamRead(stream, buff, 255);

_CommandDisplay.string=[self._CommandDisplay.string stringByAppendingString:[NSString stringWithFormat:@"SeverCreat failed\n"]];


NSLog(@"receive: %s",buff);
NSLog(@"%@",clientCallBackInfo);
CFReadStreamClose(inputStream);
CFReadStreamUnscheduleFromRunLoop(inputStream,CFRunLoopGetCurrent(),kCFRunLoopCommonModes);
inputStream = NULL;
 }

C 関数を使用すると、合成した _CommandDisplay を認識できませんが、読み取ったデータを NSTextView に出力する必要があります。この問題を解決するにはどうすればよいですか?

4

1 に答える 1

0

Objective-C では、合成されたプロパティfooは暗黙的なインスタンス変数によってサポートされます_foo

  • _fooインスタンス変数に直接アクセスしたい場合は、self.

  • 合成された getter と setter を使用してプロパティにアクセスする場合self.foo(アンダースコアなし)

書く

self.CommandDisplay.string = [self.CommandDisplay.string stringByAppendingString:@"SeverCreat failed\n"];

また

_CommandDisplay.string = [_CommandDisplay.string stringByAppendingString:@"SeverCreat failed\n"];

NSString stringWithFormatは必要ありません。フォーマットパラメータはありません。また、@synthesize行を削除することもできます。これも必要ありません。

ちょっとした補足:

C 関数が実装ブロックの範囲外にある場合は、関数のパラメーターを介して NSTextView インスタンスへの参照を渡す必要がありますinfoが、この場合は機能するはずです。

于 2015-07-15T12:29:15.630 に答える