gpt4 book ai didi

ios - 在 iOS 的 C 函数中使用 ARC 取消引用指针

转载 作者:可可西里 更新时间:2023-11-01 05:45:08 25 4
gpt4 key购买 nike

我正在使用 The Amazing Audio Engine 来处理 iOS 应用同步中的播放。

该框架要求您使用 C 函数作为在音频线程上调用的回调 (playbackTimingReceiver)。然后,您需要使用向其传递处理程序 (pageTurnHandler) 的 C 函数 (AEAudioControllerSendAsynchronousMessageToMainThread) 再次向主线程发送消息。

我在使用 C 语言方面经验不足,但据我了解,我在消息中传递了一个需要取消引用的指针。

我可以通过这条线成功实现:

PlaybackManager* receiver = *((PlaybackManager**)userInfo);

但前提是我在项目目标的编译源中使用 -fno-objc-arc 标志在该文件的项目中关闭 ARC。

我的问题是,是否可以在打开 ARC 的情况下实现此目的?如果是这样,正确的语法是什么?

相关代码段:

#pragma mark - Audio Timing Callback
-(AEAudioControllerTimingCallback)timingReceiverCallback
{
return playbackTimingReceiver;
}

static void playbackTimingReceiver(PlaybackManager* receiver,
AEAudioController *audioController,
const AudioTimeStamp *time,
UInt32 const frames,
AEAudioTimingContext context)
{
receiver->_hostTime = getUptimeInMilliseconds(time->mHostTime);
AEAudioControllerSendAsynchronousMessageToMainThread(audioController,
pageTurnHandler,
&audioController,
sizeof(id));
}

static void pageTurnHandler(AEAudioController *audioController, void *userInfo, int userInfoLength)
{
PlaybackManager* receiver = *((PlaybackManager**)userInfo);
NSLog(@"Receiver:%@", receiver);
}

最佳答案

PlaybackManager * receiver = (__bridge_transfer id)*(void **)userInfo;

应该可以解决问题。这首先将 userInfo 转换为一个指向指针的指针,因为它包含原始对象指针的地址。取消引用以获取原始指针,并将 __bridge_transfer 与类型一起使用 - idPlaybackManager 将起作用 - 告诉 ARC 取消引用value 实际上是一个它需要照顾的对象。

关于ios - 在 iOS 的 C 函数中使用 ARC 取消引用指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17735638/

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