вы не можете использовать объект c ++ таким образом (как аргумент этого метода NSThread). если ваш случай прост (читай: объявлено несколько интерфейсов), то вы можете создать служебный класс (objc) для обработки сообщения и передачи аргумента обратно экземпляру AudioController. иллюстрации:
(следует нескомпилированный псевдокод)
namespace pseudo_object {
template <typename> class reference_counted;
}
@interface MONAudioControllerWorker : NSObject
{
pseudo_object::reference_counted<AudioController> audioController_;
std::string asset_;
}
+ (MONAudioControllerWorker *)newMONAudioControllerWorkerWithAudioController:(pseudo_object::reference_counted<AudioController>&)audioController asset:(const std::string&)asset;
- (void)secondaryWorker;
@end
@implementation MONAudioControllerWorker
+ (MONAudioControllerWorker *)newMONAudioControllerWorkerWithAudioController:(pseudo_object::reference_counted<AudioController>&)audioController asset:(const std::string&)asset
{
/* ... */
}
- (void)secondaryWorker
{
NSAutoreleasePool * pool([NSAutoreleasePool new]);
audioController_->RotateThread(asset_);
[pool release];
}
@end
/* static */
ALuint AudioController::PlayStream(pseudo_object::reference_counted<AudioController>& This, const string& asset)
{
/* attach to a thread */
MONAudioControllerWorker * controller = [MONAudioControllerWorker newMONAudioControllerWorkerWithAudioController:This asset:asset];
[NSThread detachNewThreadSelector:@selector(secondaryWorker) toTarget:controller withObject:0];
[controller release];
}
иногда просто проще создать класс objc, который может содержать упрощенный (универсальный) интерфейс для этой цели (то есть многократно используемый за пределами этого объекта), или использовать более традиционные подпрограммы потоков (pthreads). если это единственный случай в проекте, то все должно быть в порядке. в противном случае вы получите много полезных классов / символов и многое другое для обслуживания. иллюстрации:
@interface MONAudioControllerWrapper : NSObject
{
AudioController audioController_;
std::string asset_;
}
+ (MONAudioControllerWrapper *)newMONAudioControllerWrapperWithAsset:(const std::string&)asset;
- (void)playStream;
@end
@implementation MONAudioControllerWrapper
+ (MONAudioControllerWrapper *)newMONAudioControllerWrapperWithAsset:(const std::string&)asset
{
/* ... */
}
- (void)secondaryWorker
{
NSAutoreleasePool * pool([NSAutoreleasePool new]);
audioController_->RotateThread(asset_);
[pool release];
}
- (void)playStream
{
[NSThread detachNewThreadSelector:@selector(secondaryWorker) toTarget:self withObject:0];
}
@end