2015-07-15 5 views
0

это мой код в ViewController.h в КАКАО для реализации «CFsocket»Предупреждать «использование необъявленной сам идентификатор» при использовании с функцией

@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, как я могу решить эту проблему?

ответ

0

В Objective-C синтезированное свойство foo поддерживается неявной переменной экземпляра _foo.

  • Если вы хотите получить доступ к переменной экземпляра напрямую использовать _foo без self.

  • Если вы хотите получить доступ к свойству его синтезированной геттер и сеттер использования 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, но в этом случае он должен работать