作为Objective C类成员的C ++ vector不保留值

问题描述 投票:2回答:1

所以我有一个Objective C类,它将实现NSTableViewDataSource协议来显示音频输出设备列表。我正在调用一个C ++类,它返回设备信息作为表单的C结构的std :: vector

typedef struct DeviceInfo {
    AudioDeviceID devID;
    char name[128];
    int nInputChannels;
    int nOutputChannels;
} DeviceInfo;

Objective C类是

@interface PreferencesViewController : NSObject <NSTableViewDataSource> {

    AudioOutputController *audioOutputController_;
    vector<DeviceInfo> audioOutputDevices_;
}

- (void)setAudioOutputController:(AudioOutputController *)controller;
- (void)updateDeviceList;
- (IBAction)buttonPressed:(id)sender;

@end

主app控制器设置PreferencesViewController的AudioOutputController成员(C ++类),然后调用updateDeviceList(),告诉AudioOutputController查询可用的音频设备并返回DeviceInfo结构的向量

- (void)updateDeviceList {
    /* Update the list of currently connected devices and return device information */
    audioOutputController_->setAvailableDevices();

    audioOutputDevices_.clear();
    audioOutputDevices_ = audioOutputController_->getAvailableDevices();

    for (int i = 0; i < audioOutputDevices_.size(); i++) {
        printf("Device %d: %s\n", i, audioOutputDevices_[i].name);
        printf("\t%d Output Channels\n", audioOutputDevices_[i].nOutputChannels);
    }
 }

这一切都完全正常并打印可用的音频设备,但结构的向量似乎没有在updateDeviceList()之外保留其值,所以当我尝试在NSTableViewDataSource协议方法中访问它时,我看到一个空向量。例如,如果我尝试在IBAction方法中打印矢量的大小

- (IBAction)buttonPressed:(id)sender {
    printf("audioOutputDevices_.size() = %lu\n", audioOutputDevices_.size());
}

它说矢量是空的。我是组合C ++和Objective C的新手,所以非常感谢任何帮助。

编辑:其他特殊的东西。如果我从AppDelegate的applicationDidFinishLaunching()调用PreferencesViewController的updateDeviceList()方法,如下所示:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

    audioOutputController_ = new AudioOutputController();
    preferences_ = [[PreferencesViewController alloc] init];
    [preferences_ setAudioOutputController:audioOutputController_];
    [preferences_ updateDeviceList:self];

}
@end

然后我得到上面提到的问题,C ++向量没有保留其值。如果我改为使用updateDeviceList()作为接口按钮的IBAction回调,那么当我调用它时,它会保留其值并将设备信息添加到表中。

objective-c++
1个回答
0
投票

我相信(从我的类似经验)在应用程序启动期间,vector<DeviceInfo> audioOutputDevices_的C ++构造函数以某种方式再次被调用,从而清除它。

© www.soinside.com 2019 - 2024. All rights reserved.