【问题标题】:EXC_BAD_ACCESS when init a struct初始化结构时的 EXC_BAD_ACCESS
【发布时间】:2015-07-25 01:16:00
【问题描述】:

我正在使用 Objective-C/OSX 开发一个应用程序(第一次尝试)。我有一个结构(NSDevice 自定义类型),需要作为公共/外部变量访问,以允许类的不同接口访问它。

这是标题中的声明。

struct NSDevice{
    LIBMTP_raw_device_t * usbrawdevice;
    int numusbrawdevice;
    uint32_t rawdeviceID;

    LIBMTP_mtpdevice_t *device;
};

extern struct NSDevice *Device;

@interface DeviceManager : NSObject

- (void) openDevice;
- (void) closeDevice;

@end

以及我如何在源文件中实现它

#import "DeviceManager.h"

struct NSDevice *Device = NULL;


@implementation DeviceManager



- (id)init{
    self = [super init];
    if(self){
        NSLog(@"Init");
        LIBMTP_Init();

        Device->device = NULL;
        Device->numusbrawdevice = 0;
        Device->rawdeviceID = 0;
        Device->usbrawdevice = NULL;
    }
    return self;
}

- (NSMtp_error) openDevice {
    LIBMTP_error_number_t error = LIBMTP_ERROR_GENERAL;

    NSLog(@"Opening Device");

    error = LIBMTP_Detect_Raw_Devices(&Device->usbrawdevice, &Device->numusbrawdevice);

当尝试在 init 接口中初始化结构时,我得到了一个 EXC_BAD_ACCESS。有什么想法吗?

我可以使用“结构”还是在 Objective-C 中有更好的方法?

谢谢

【问题讨论】:

  • 您声明了一个名为 * Device 的指针,但我没有看到您为其创建指向的结构的任何地方。
  • 抱歉复制粘贴错误...
  • 我仍然没有看到任何 Device = ... 类型的逻辑。
  • @Philip... 我应该很累,但没有抓住重点。执行 struct NSDevice *Device = NULL; 时,设备在源文件顶部初始化
  • 没错。它是 NULL,这意味着它没有指向实际的初始化结构。所以当你说Device->device = NULL; 时,实际上就像输入 NULL->device = NULL;.

标签: objective-c macos


【解决方案1】:

Seb,你需要为Device分配空间。

尝试这样做:

- (id)init{
    self = [super init];
    if(self){
        NSLog(@"Init");
        LIBMTP_Init();

        Device = malloc(sizeof(NSDevice));
        Device->device = NULL;
        Device->numusbrawdevice = 0;
        Device->rawdeviceID = 0;
        Device->usbrawdevice = NULL;
    }
    return self;
}

并像这样声明你的结构:

typedef struct {
    LIBMTP_raw_device_t * usbrawdevice;
    int numusbrawdevice;
    uint32_t rawdeviceID;

    LIBMTP_mtpdevice_t *device;
} NSDevice;

另外,我强烈建议NSDevice 的名称更改为 SebDevice 或不以 NS 开头的名称,因为这些前缀字符通常表示MacOS SDK 中内置了一些东西,它会让其他在您离开项目后必须查看您的代码的人感到困惑。

最后一件事,像这样的全局变量不应该以大写字母开头。在 Objective-C 中,最佳实践是变量以小写字母或g(全局)或下划线开头。将Device 更改为gDevice

【讨论】:

  • 谢谢,我之前尝试过,但它在 NSDevice 中抱怨。该结构在标头中声明,但 malloc 无法解析符号 NSDevice
  • 你需要在结构声明前添加一个“typedef”。
  • 谢谢,但编译器抱怨 Device->device = NULL;说这是不完整的定义
  • 您是否包含了定义 LIBMTP_mtpdevice_t 是什么的 .h 文件?另外,当您将NULL 更改为nil 时会发生什么?
  • 这里没有更改和包含。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多