gpt4 book ai didi

c++ - 从 C++ 方法调用 Objective-C 方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:46:52 25 4
gpt4 key购买 nike

你好,我知道这个问题已经讨论过好几次了,但我觉得没有其他解释对我有用。也许这是不可能的,但是......目前我有 mm 文件,它看起来像(初始化方法/头文件)obj-c 除了少数 C++ 方法(我使用的库 live555 是用 C++ 编写的),我可以调用C++ 方法形成 obj-c 就好了。但是当我想在 C++ 中调用 obj-c 时......然后我得到了错误。我知道 self 不知道。但是我怎样才能移动它呢?我尝试使用 2-3 个 tuts,但它们都假设在 obj-c++ 类中未调用 obj-c 方法。

我的 Obj-C++ 类(.mm 文件)

@interface testSender : NSObject{
@private
NSMutableArray *_buffors;
}

+(id)voiceSender;
//Function to invoke
-(bool)continueSendBuffer;

@end

@implementation testSender
@synthesize address=_address,port=_port;

UsageEnvironment* env;

+(id)voiceSender{
return [[self alloc]init];
}

- (id)init
{
self = [super init];
if (self) {
[self initRTPProt];
_buffors = [NSMutableArray array];

}
return self;
}

-(void)initRTPProt{
//init protocol
}

void afterPlaying(void* clientData); // forward


void afterPlaying(void* /*clientData*/) {
// We and stream and now I want check if it's some other streams to send so normaly I should call
[self continueSendBuffer];

}


-(bool)continueSendBuffer{
if ([_buffors count] == 0) return false;
NSData *nextBuffer = [_buffors objectAtIndex:0];
[_buffors removeObjectAtIndex:0];

[self sendNextBuffer:nextBuffer];

return true;
}

-(void)sendNextBuffer:(NSData*)buffer{
// Send next buffer
/setting sessionState..



// Start the streaming:
*env << "Beginning streaming...\n";

// Method afterPlaying will be called after ther will be nothing to send
sessionState.sink->startPlaying(*sessionState.source, afterPlaying, NULL);
env->taskScheduler().doEventLoop();
}

@end

在 c++ 方法 void afterPlaying(void*) 中,当我想使用 [self continueSendBuffer] 时,我得到了错误 Use of undeclared identifier 'self'.


已解决

Chuck 做得很好,向我解释了 Objective-C++ 的工作原理。 Read it!基本上你不能在“c++ 方法”(我知道有自由 float 方法)中调用 obj-c 方法而不传递给它们 self 指针。

我必须修改一点 startPlaying 调用,现在在第三个参数中我传递了 self 指针此外,afterPlaying 方法也必须更改,因此现在她可以使用 clientData 指针。通过这个我可以调用 continueSendBuffer

开始播放

sessionState.sink->startPlaying(*sessionState.source, afterPlaying, (__bridge void*)self);

播放后

void afterPlaying(void* clientData) {
[(__bridge NXVoiceSender*)clientData continueSendBuffer];
}

最佳答案

Objective-C++ 没有统一 C++ 类和 Objective-C 类。它允许您混合使用 Objective-C 代码和 C++ 代码,但是这两个对象模型仍然是完全独立的——它基本上只使用 C++,而 C 将在普通的 Objective-C 中使用。你所说的“C++ 方法”实际上只是自由 float 函数,因为 Objective-C 类定义不是 C++ 中的特殊上下文。它们不是类的方法。

您将需要以某种方式保留指向相关对象的指针并将其放入 afterPlaying() 函数(并且还需要保持对象存活足够长的时间以便在 afterPlaying 时被引用() 被调用)。我不熟悉该库,但 clientData 参数看起来很有前途。

关于c++ - 从 C++ 方法调用 Objective-C 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20960691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com