Cocoa 将NSTextField指针传递给iOnBinterfaceInterface182回调

Cocoa 将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

我正在从USB打印机进行异步读取。阅读正确。我的问题是从回调中更新NSTextField

-(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
    。事实上,让我们看看这个回调是怎么说的:
  • 雷夫康

    refcon已传递到原始I/O请求中

    我的结论是,您的代码应该是:

    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。