Предупредить "использование необъявленного идентификатора себя" при использовании функции c

Это мой код в ViewController.h в CoCoa для реализации "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, как я могу решить эту проблему?

1 ответ

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

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

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

Другие вопросы по тегам