Предупредить "использование необъявленного идентификатора себя" при использовании функции 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
параметр функции, но в этом случае он должен работать