将实例方法作为函数指针传递给 C 库

2023-12-29

我正在编写一个使用 C 库的 Objective-C 应用程序。我目前面临的问题是,C 库有一个结构,其中某些字段是函数指针,稍后用作回调。如何将 Objective-C 实例方法转换为函数指针并将其传递给库?


您需要在 Objective-C 类实现文件中提供 C 回调函数,并且只有当回调能够使用context某种指针。

所以想象一下 C 回调签名是这样的:

void myCallback(void *context, int someOtherInfo);

然后在 Objective-C 类实现文件中,您需要使用该回调来蹦床回到您的 Objective-C 类(使用context指针作为要调用的类的实例):

// Forward declaration of C callback function
static void theCallbackFunction(void *context, int someOtherInfo);

// Private Methods
@interface MyClass ()
- (void)_callbackWithInfo:(int)someOtherInfo;
@end

@implementation MyClass

- (void)methodToSetupCallback
{
    // Call function to set the callback function, passing it a "context"
    setCallbackFunction(theCallbackFunction, self);
    ...
}

- (void)_callbackWithInfo:(int)someOtherInfo
{
    NSLog(@"Some info: %d", someOtherInfo);
}

@end

static void theCallbackFunction(void *context, int someOtherInfo)
{
    MyClass *object = (MyClass *)context;
    [object _callbackWithInfo:someOtherInfo];
}

如果你的 C 回调函数不接受某种context信息,那么:

  1. 它已损坏,应该修复/报告为错误。
  2. 您将需要依赖存储指向自身的指针在 C 回调函数使用的全局、静态范围内。这将限制实例的数量MyClass to one!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将实例方法作为函数指针传递给 C 库 的相关文章

  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 以编程方式读取 SQL Server 查询计划建议的 SQL 特定执行的索引?

    如果我在 SSMS 中运行此命令 set showplan xml on GO exec some procedure arg1 arg2 arg3 GO set showplan xml off GO 我获得查询执行中涉及的完整调用堆栈的
  • 带有 Core Data 对象的动态 UITableView 高度

    过去几天我一直在试图解决一个谜团 即为什么我的批处理大小为 20 的 NSFetchedResultsController 总是在获取完成后立即错误 即加载到内存中 我的所有对象 从而导致请求需要约 20 秒 事实证明 这是因为在我的 he
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 是什么导致了这个 iPhone 崩溃日志?

    我有点卡住了 需要解决这个问题 因为我的一个应用程序出现了随机崩溃 而这些崩溃并不总是能够重现 这是崩溃日志之一 Incident Identifier 59865612 9F00 44EA 9474 2BF607AD662E CrashR
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • 如何确定iPhone铃声的当前级别?

    我正在使用 AVSystemController 将 iPhone 铃声静音 但我不知道如何确定铃声的当前级别 有任何想法吗 PS 是的 我知道使用 AVSystemController 可能会导致应用程序被 App Store 禁止 这不
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有

随机推荐

  • 在 xaml 上设置 GroupStyle 内部样式

    我正在尝试为 ContextMenu 设置默认样式 并且我想在样式内设置默认 GroupStyle ContextMenu 像这样的事情
  • Qt C++ 在 GUI 线程之外显示图像(Boost 线程)

    我正在开发一个C 库 使用VS2015通过Qt实现其接口 在图书馆方面 3增强线程连续加载 3 个文件夹中的图像 我正在尝试以 3 种不同的方式显示这些图像QLabel 或同等学历QWidgets 所以线程体由这个功能组成 特别是通过利用设
  • Windows 上的 Makefile 干净

    我现在正在学习如何使用 makefile 我制作了以下 makefile 我在 Windows 上使用 Visual Studio 命令行编译器 CC cl CFLAG EHsc test database exe composer obj
  • 如何从 LocalDate 和 LocalDateTime 中提取纪元?

    如何提取纪元值Long来自实例LocalDateTime or LocalDate 我试过了 以下 但它给了我其他结果 LocalDateTime time LocalDateTime parse 04 02 2014 19 51 01 D
  • CSS:动画与过渡

    我了解如何执行 CSS3过渡 https developer mozilla org en US docs Web CSS CSS Transitions Using CSS transitions and 动画 https develop
  • Rails 3 自动添加 X-UA-Compatible 标头?

    如果您使用 IE8 Rails 3 会自动添加标头吗 我看到 X UA Compatible 的元标记设置为 IE 8 0000 它扰乱了我的观点之一 我似乎找不到其他任何可以做到这一点的东西 所以我想我应该问这里的大脑 谢谢 鲁普里克特
  • 使用 scipy、numpy、python 等进行 sigmoidal 回归

    我有两个变量 x 和 y 它们彼此之间存在某种 S 型关系 并且我需要找到某种预测方程 使我能够在给定 x 的任何值的情况下预测 y 的值 我的预测方程需要显示两个变量之间的 S 形关系 因此 我不能满足于产生一条直线的线性回归方程 我需要
  • AbcPdf - 未应用 CSS 的文档

    这可能更多是一个技术支持问题 但我想知道是否有其他开发人员遇到过这种情况 我在 ASP NET 代码中使用 Abcpdf 从 HTML 生成 PDF 它工作正常 但一名用户生成的 PDF 没有应用 CSS IE8 Adobe Acrobat
  • 如何将文本区域数据发送到另一个页面?

    我对这种事情很陌生 我需要将 3 个文本区域中的数据提交到另一个页面 我怎么做 附 如果可以的话 我会使用输入 您需要使用表单创建页面 例如将其命名为 form html 使用此代码例如
  • 等待异步函数结果未定义

    我在使用 Node js 进行异步 等待时遇到问题 当我尝试这个时 function Read Json File fs readFile import json utf 8 err data gt if err throw err jso
  • Google Places API - 查找公司的 CID 和 LRD

    有人知道如何使用 Google Places API 查找公司的 CID 和 或 LRD 吗 到目前为止我想出的最好的解决方案是 Go to https maps google com https maps google com并搜索该业务
  • 为什么公共语言运行时不支持 Java [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Eclipse - maven - 我应该执行什么目标才能从 Maven 实际部署到 Wildfly(达到与“在服务器上运行”eclipse 命令相同的结果)

    Maven 新手 我有一个 Eclipse 项目 我可以右键单击 gt 运行为 gt 在服务器上运行它在我本地的 Wildfly 安装上成功运行 有没有办法R单击 gt 运行为 并选择适当的maven目标来达到相同的效果 即打包为war 复
  • WPF 中的双向绑定

    我无法在 WPF 中实现双向绑定 我的应用程序主窗口中有一个绑定到文本框的字符串属性 我将模式设置为 TwoWay TextBox 的值唯一更新的时间是窗口初始化时 当我在文本框中键入内容时 基础字符串属性值不会更改 当字符串属性的值被外部
  • Heroku 和网页抓取

    我有一个 nokigiri 网络抓取工具 它发布到我正在尝试发布到 heroku 的数据库 我有一个 sinatra 应用程序前端 我想从数据库中提取它 我是 Heroku 和 Web 开发的新手 不知道处理此类问题的最佳方法 我是否必须将
  • 如果没有预处理步骤,Qt 的可用性如何?

    我认为库要求使用特殊工具对我的源代码进行预处理是不合理的 也就是说 有几个人向我推荐了 Qt 库来进行跨平台 GUI 开发 如果没有预处理步骤 Qt 的可用性如何 编辑 好吧 大家 我并不是说这个问题是对 Qt 的攻击 太多的 Qt 粉丝都
  • 将 php 异常重新抛出到更高级别的 catch 块中

    我试图将异常从特定的 catch 块传递到更通用的 catch 块 但它似乎不起作用 当我尝试以下操作时 出现 500 服务器错误 这可能吗 我意识到有一些简单的解决方法 但是说 嘿 我不想处理这个错误 让我们让更通用的异常处理程序来处理它
  • 使用 awk 打印从零开始的行号

    谁能告诉我如何使用 awk 打印包括零的行号 这是我的输入文件 当我运行下面的 awk 命令时我得到 awk print NR 0 stackfile2 txt tr gt actual output txt 而我的预期输出是 如何打印以零
  • JavaScript 在 Thymeleaf 和 Spring Boot 中无法按预期工作

    JavaScript 在 thymeleaf 中不起作用 在 Spring Boot Thymeleaf 中 首先可以打开模态 但第二 第三 东西无法打开模态 每个事物都有类名 但只有第一个事物可以打开模态 我认为 JavaScript 只
  • 将实例方法作为函数指针传递给 C 库

    我正在编写一个使用 C 库的 Objective C 应用程序 我目前面临的问题是 C 库有一个结构 其中某些字段是函数指针 稍后用作回调 如何将 Objective C 实例方法转换为函数指针并将其传递给库 您需要在 Objective