所以我有一个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回调,那么当我调用它时,它会保留其值并将设备信息添加到表中。
我相信(从我的类似经验)在应用程序启动期间,vector<DeviceInfo> audioOutputDevices_
的C ++构造函数以某种方式再次被调用,从而清除它。