Cocoa 将NSTextField指针传递给iOnBinterfaceInterface182回调
我正在从USB打印机进行异步读取。阅读正确。我的问题是从回调中更新NSTextFieldCocoa 将NSTextField指针传递给iOnBinterfaceInterface182回调,cocoa,callback,usb,Cocoa,Callback,Usb,我正在从USB打印机进行异步读取。阅读正确。我的问题是从回调中更新NSTextField -(IBAction)printTest:(id)sender { // Setup... then: NSLog(@"starting async read: %@", _printerOutput); NSLog(@"_printerOutput pointer = %p", _printerOutput); result = (*interface)->Rea
-(IBAction)printTest:(id)sender
{
// Setup... then:
NSLog(@"starting async read: %@", _printerOutput);
NSLog(@"_printerOutput pointer = %p", _printerOutput);
result = (*interface)->ReadPipeAsyncTO(interface,
1,
readBuffer,
numBytesRead,
500,
1000,
USBDeviceReadCompletionCallback,
&(_printerOutput)
);
starting async read: <NSTextField: 0x10221dc60>
_printerOutput pointer = 0x10221dc60
_printerOutput pointer = 0x0
回调定义为:
void USBDeviceReadCompletionCallback(void *refCon, IOReturn result, void *messageArg)
{
NSTextField *printerOutput = (__bridge NSTextField *) messageArg;
NSLog(@"_printerOutput pointer = %p", printerOutput);
}
指针在回调内部时将丢失其值
-(IBAction)printTest:(id)sender
{
// Setup... then:
NSLog(@"starting async read: %@", _printerOutput);
NSLog(@"_printerOutput pointer = %p", _printerOutput);
result = (*interface)->ReadPipeAsyncTO(interface,
1,
readBuffer,
numBytesRead,
500,
1000,
USBDeviceReadCompletionCallback,
&(_printerOutput)
);
starting async read: <NSTextField: 0x10221dc60>
_printerOutput pointer = 0x10221dc60
_printerOutput pointer = 0x0
启动异步读取:
_打印机输出指针=0x10221dc60
_printerOutput指针=0x0
我在很多地方都试着模仿不同的方法来传递指针。只有一种正确的方法。:)
主题的另一个变体:(u桥空*)(u打印输出)。这也不行
我知道回调的类型是IOAsyncCallback1
其他值得注意的网址:
而我认为
\u printerOutput
是一个NSTextField*
首先,将NSTextField**
传递到回调中是否有特殊原因?(注意传递给ReadPipeAsyncTO
的最后一个参数中的符号和)
第二,作为预防措施,我会使用敏感代码避免ARC
第三,ReadPipeAsyncTO
的最后一个参数称为refcon
。回调的第一个参数被称为refCon
,这是巧合吗?注意,您试图从messageArg
获取文本字段,而不是refCon
继续我的第三点
ReadPipeAsyncTO
有一个名为refcon
的参数。这是最后一个参数\u printerOutput
(不要传递&(\u printerOutput)
)的指针--\u printerOutput
已经是指针refcon
。事实上,让我们看看这个回调是怎么说的:void USBDeviceReadCompletionCallback(void *refCon, IOReturn result, void *messageArg)
{
NSTextField *printerOutput = (__bridge NSTextField *) refCon; // <=== the change is here
NSLog(@"_printerOutput pointer = %p", printerOutput);
}
void usbdeviceradcompletioncallback(void*refCon、IOReturn结果、void*messageArg)
{
NSTextField*printerOutput=(\u桥NSTextField*)refCon;//是,\u printerOutput是定义为@property(assign)的NSTextField对象IBMOutlet NSTextField*printerOutput;可以肯定地说,我的代码是基于这一点上的猜测。IOAsyncCallback1的第一个参数是原始的refCon,在本例中是变量接口。IOAsyncCallback1在这里有文档记录,也有此线程,但此代码仍然会导致指针变为无值。@Caylvanlarson I“我在这里也试图做到透视,因为我从未详细处理过IOKit
(至少不是在这个层面上,也不是在打印机方面).但我感觉你没有查看回调收到的refcon
参数的值。请参阅我的编辑。你是对的,回调中的refcon是参数_printerOutput。非常好。谢谢你,Ivan。