【问题标题】:Call an IOUSBDeviceInterface function on an obj-c object instead of a C structure在 obj-c 对象而不是 C 结构上调用 IOUSBDeviceInterface 函数
【发布时间】:2012-07-11 02:28:59
【问题描述】:

假设我想关闭一个 USB 设备。下面是一个代表 USB 设备的 C 结构体:

struct __USBDevice {

uint16_t idProduct;
io_service_t usbService;
IOUSBDeviceInterface **deviceHandle;
IOUSBInterfaceInterface **interfaceHandle;
Boolean open;

};

typedef struct __USBDevice *USBDeviceRef;

这是关闭设备的代码:

// device is a USBDeviceRef structure
// USBDeviceClose is a function member of IOUSBDeviceInterface C Pseudoclass

(*device->deviceHandle)->USBDeviceClose(device->deviceHandle);

现在假设设备属性在 obj-c 类中声明

@interface Device : NSObject {

NSNumber idProduct
io_service_t usbService;
IOUSBDeviceInterface **deviceHandle;
IOUSBInterfaceInterface **interfaceHandle;
BOOL open;
}

@end

如何调用 USBDeviceClose() ?

【问题讨论】:

    标签: objective-c c usb iokit


    【解决方案1】:

    有两种方法。您可以将类建模为类似于结构,并在声明上方添加@public(这样语法不会改变),或者您可以在接口中添加Close方法,该方法将在内部执行相同的逻辑(但当然不需要取消引用device)。

    【讨论】:

    • 您能否提供第一种方式的快速代码示例?谢谢。
    • 我已经这样做了,只需在所有 iVar 上方添加 @public。然后你可以像这样device->idProduct 等访问它们。
    【解决方案2】:

    无需多余。 Ivar 可以是结构体。

    @interface Device : NSObject {
    
    USBDeviceRef deviceRef;
    }
    
    @end
    
    #implementation Device
    
    - (void) close {
    USBDeviceClose(deviceRef->deviceHandle);
    }
    

    【讨论】:

    • 你没忘记 (*deviceRef->deviceHandle)-> 就在 USBDeviceClose 之前吗?
    猜你喜欢
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 2011-11-25
    • 2020-03-22
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多