将函数指针“转换”为 Objective-C 中的块

2023-12-27

我正在做一些从 Mono C# 到 Obj-C 的互操作,并遇到了这个问题。 C# 代码需要传递回调 - 它使用函数指针来执行此操作。 我可以从 Obj-C 端获取函数指针并调用它,一切正常。 但我现在需要将该函数指针作为回调提供给第三方 API,该 API 使用块作为回调。 我希望第三方调用 C# 函数 - 所以在某种程度上我试图将函数指针转换为一个块,以便第三方可以运行它,或者制作某种桥梁 - 创建我自己的运行块该函数指针并将其交给第三方。我似乎找不到一种方法来做到这一点 - 我如何生成一个包含要运行哪个函数的信息的块,然后将其提供给第三方。 也许我还有另一种选择?

编辑:将函数放入全局变量中可能可行,但我希望能够拥有多个函数,因为第三方 API 是异步的,我不希望它调用错误的回调。

我尝试过的代码:

typedef void (*DummyAction)(char * result);
typedef void (^DummyBlock)(char * result);

@interface FunctionToBlock : NSObject
{
    DummyAction function;
    DummyBlock block;
}

- (id) initWithFunction: (DummyAction) func;
- (DummyBlock) block;
@end

@implementation FunctionToBlock : NSObject
- (id) initWithFunction: (DummyAction) func {
    if (self = [super init]) {
        function = func;
        block = ^(char * result) {
            function(result);
        };
    }
    return self;
}

- (DummyBlock) block {
    return block;
}
@end

然后我运行这个

void RegisterCallback( char * text, DummyAction callback)
{
    FunctionToBlock *funcToBlock = [[FunctionToBlock alloc] initWithFunction : callback];
    funcToBlock.block(text);
}

并且它因 BAD_ACCESS 而失败。也许我做错了什么,因为我还不太精通 Obj-C。我可以确认如果直接运行回调是可以的,并且正在调用该块,但它在函数(结果)行上失败。


为什么不只是有一个简单的功能

typedef void (*DummyAction)(char * result);
typedef void (^DummyBlock)(char * result);

DummyBlock functionToBlock(DummyAction func) {
    return [[^(char * result) {
                 func(result);
             } copy] autorelease];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将函数指针“转换”为 Objective-C 中的块 的相关文章

  • iOS 8 UITableView 分隔符插入 0 不起作用

    我有一个应用程序 其中UITableView的分隔符插入设置为自定义值 右0 Left 0 这完美地适用于iOS 7 x 但是在iOS 8 0我看到分隔符插入设置为默认值15在右侧 即使在 xib 文件中它设置为0 它仍然显示不正确 我该如
  • 目标操作 uicontrol 事件

    我一定在这里遗漏了一些明显的东西 但是 UIControl有一个方法 void addTarget id target action SEL action forControlEvents UIControlEvents controlEv
  • 为什么我的 x 轴在 iPhone 上不显示核心图?

    编辑 我认为我的问题更好地表述为 我怎样才能有一个不从零开始的 Y 轴 看起来 x 轴总是放置在 y 0 处 但我希望 x 轴位于 y 轴上的某个正数 这是一张包含更多常规数据的图表 我只是希望将 x 轴放置在绘图的最小 y 值 大约 77
  • iOS 上读取证书问题

    我正在尝试从 iOS 中的各种 URL 读取证书 然而 我的代码运行不佳 应该返回我需要的信息的数组总是返回null 我缺少什么 void findCertificate NSString url NSInputStream input N
  • UIWebView stringByEvaluatingJavaScriptFromString 在后台

    在 iOS 应用程序中 我正在运行一个相当大的脚本UIWebView using stringByEvaluatingJavaScriptFromString 就 JavaScript 字符串的长度而言较大 调用 JavaScript 后会
  • 如何使用 AutoLayout 使 UIView 向上滑动动画?

    this is what I like to achieve 我想执行向上滑动动画 用户可以向上滑动 UIView2 并且 UIView2 将在屏幕上停止一半 我知道如何通过 UIButton 操作以模态方式呈现 UIViewControl
  • Objective C - 动态属性的respondsToSelector

    我目前面临的问题是检查对象 NSManagedObject 的属性是否存在 不幸的是方法 MyObject class respondsToSelector selector myProperty 总是返回NO 我认为这是因为CoreDat
  • Objective-C 字符串文字的预处理器宏值

    我在构建设置中定义了一个预处理器宏 FOO BAR 我想将该值转换为可以传递给方法的 Objective C 字符串文字 以下 define 不起作用 但它应该展示我想要实现的目标 define FOOLITERAL FOO want FO
  • 在实现文件中声明接口(Objective-C)

    在上一个版本的 xCode 4 3 中 我看到了预定义模板 例如我们的 Master Detail 模板 其中接口声明是在 m 文件中进行的 例如 在文件 MyFile h 中有 interface MyFile property nona
  • 如何将 JPG 文件加载到 NSBitmapImageRep 中?

    Objective C 可可 我需要将 JPG 文件中的图像加载到二维数组中 以便可以访问每个像素 我正在尝试 未成功 将图像加载到 NSBitmapImageRep 中 我尝试了以下两行代码的几种变体 NSString filePath
  • 迁移大型 Core Data 数据库崩溃

    我有一个将产品存储在核心数据文件中的应用程序 这些产品包括作为 可转换 数据的图像 现在我尝试使用轻量级迁移添加一些属性 当我使用一个小型数据库对其进行测试时 它运行良好 但当我使用一个接近 500 MB 的大型数据库时 应用程序通常会因内
  • 为什么 Objective-C 使用 YES 和 NO 而不是 1 和 0? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Objective C 使用 YES 和 NO 而不是 1 和 0 是否有任何技术原因 或者只是为了使其更具可读性 使其更具可读性is技术原因
  • 空 NSDatePicker

    你好 是否可以让 NSDatePicker 代表 nil 对象 类似 或任何其他方式 谢谢 拉杜 简短回答 否 NSDatePicker 只是忽略无效日期和 nil 例如 这不会更新 NSDatePicker 旧值仍然存在 datePick
  • 将 scanf 与 NSString 一起使用

    我希望用户输入一个字符串 然后将输入分配给 NSString 现在我的代码如下所示 NSString word scanf s word The scanf http www cplusplus com reference clibrary
  • NSString 上的 stringWithFormat 与 initWithFormat

    我想知道以这种方式声明 NSString 有什么区别 例如缺点和 或优点 NSString noInit NSString stringWithFormat lolcatz d i 与以下相反 NSString withInit NSStr
  • 从 iPhone 设备查找当前国家/地区

    我必须在 iPhone 设置中获取当前国家 地区 谁能告诉我如何在 iPhone 应用程序中获取当前国家 地区 我必须使用当前国家 地区来解析需要传递当前国家 地区的 RSS 提要 请帮我找到那个国家 提前致谢 要查找用户选择的语言所在的国
  • 使用 Python-AppKit-Objective C 转换为预组合 Unicode 字符串

    苹果公司的这份文件技术问答 QA1235 http developer apple com qa qa2001 qa1235 html描述了一种将 unicode 字符串从组合版本转换为分解版本的方法 由于我对包含某些字符 例如重音符号 的
  • 使用按计数分组的核心数据获取属性

    这是我想为 Core Data 编写的查询的 SQL 版本 SELECT Group Name COUNT Item Name FROM Item INNER JOIN Group ON Item GroupID Group ID GROU
  • UITableView 无法一直滚动到底部[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我只是好奇 我做了一些UITable
  • 每个 CPU 核心处于 C0 电源状态的时间

    任何帮助弄清楚如何做到这一点都会很棒 在过去一秒内 每个 CPU 核心处于 C0 电源状态的时间有多少 这是针对 Mac 应用程序的 因此需要 Objective C cocoa 和 c OS X 没有任何公开 CPU c 状态的 API

随机推荐

  • 将请求记录到 django-rest-framework

    出于调试目的 我想使用 Django 的日志机制来记录每个传入请求 到达 django rest framework 的门口时的情况 Django 通过以下方式提供其请求的日志记录 仅 警告 日志级别及以上 来自 settings py 中
  • Apache 错误:无法加载 mod_access_compat.so

    我正在尝试运行 PHP 应用程序 但在尝试设置 Apache 2 4 时不断收到错误 错误是 httpd C Apache24 Apache24 conf httpd conf 第 72 行存在语法错误无法将 module mod acce
  • GitFlow:发布分支和主分支有什么区别?

    我刚刚看了一眼这个 gitflow 备忘单 http danielkummer github io git flow cheatsheet 我不明白release branch 谁能告诉我两者之间的区别release and master分
  • 在 AngularJS 中对对象数组进行分组

    基于如下所示的数组 var members name john team 1 name kevin team 1 name rob team 2 name matt team 2 name clint team 3 name will te
  • 如何获得 Firebase 节点的随机子节点?

    首先 这是我的数据库结构 我的目标是从 DE 节点获取一个随机问题对象以便稍后显示它 并且由于没有查询随机子项的内置支持 我必须自己从该迭代器以某种方式获取一个随机对象 目前 我有这段代码 但对如何将其串在一起感到困惑 DatabaseRe
  • 特征和序列化/反序列化

    假设我有两个特征想混合到一个班级中 每个特征都实现类需要的抽象方法 trait Writable def serialize out java io DataOutput trait T1 extends Writable trait A
  • 从POJO获取注释hibernate表名

    我有一个实体 其声明大致如下 Entity Table name myUserTable public class User implements Serializable 我正在创建一个通用 DAO 类 在此过程中我想检索 myUserT
  • 在这种情况下如何获得 foreach 循环之外的值?

    我试图从 mysql 数据中调用 foreach 循环中的所有值 并将该值输入到另一个 mysql select 语句中 看看我下面的代码 它只能收集一个值 我想使用第一个 foreach 循环来包含整个部分 但是 因为 foreach 值
  • 如何调整 GLUT 窗口的大小?

    from OpenGL extensions import alternate from OpenGL GL import from OpenGL GL ARB multitexture import from OpenGL GLU imp
  • 如何使用表达式构建匿名类型?

    在 C 3 0 中 您可以使用表达式创建具有以下语法的类 var exp Expression New typeof MyClass var lambda LambdaExpression Lambda exp object myObj l
  • 使用 QT 的任务计划程序 API

    我想实现一个基于定期日期的任务调度程序 有没有办法使用 QT 的 API 来实现它 另一个问题 我应该指定windows当前用户的用户名和密码吗 如果您想使用 Windows 任务计划程序 则需要使用 COM API http msdn m
  • 如何以编程方式将按钮添加到片段

    我无法设法以编程方式向片段添加按钮 按钮数量可变 我尝试使用 an addView 方法将按钮添加到 rootView 但没有 我尝试在充气之前将按钮添加到布局中 但我不知道如何获取布局 类型 id 错误的预期资源 RelativeLayo
  • 动画结束后我该怎么做?

    我有一个ImageView我用它来通过AnimationDrawable 当我想显示我的进度旋转器时 我这样做 animDrawable start ObjectAnimator ofFloat view alpha 1 0f setDur
  • 当具有该名称的文件已经存在时,如何防止 Django 更改文件名?

    就我而言 我允许用户上传头像图片并使用 user id 作为文件名 简单地说 所以就会有1 jpg 2 jpg等 但是我发现 如果我为某个已上传头像的帐户 假设用户 10 上传新头像 新文件将被命名为 10 1 jpg 这没关系 但是我不需
  • Bootstrap 选项卡中的多个 Google 地图

    我有一个引导选项卡结构 每个选项卡内都有一个谷歌地图 iframe 第一个选项卡的 iframe 看起来不错 但其他选项卡看起来未缩放且未居中 这与 iframe src 代码无关 因为我尝试用第二个和其他代码替换第一个 第一个总是工作得很
  • C++ 我需要在任何地方为函数编写 throw 子句吗?

    Before 考虑有一个类和一个全局函数 例如 这是usefulfuncts hpp void dosome int a int b throw std exception This is usefulfuncts cpp void dos
  • 如何在 SQL 中将表连接到自身并选择最大值

    我有一个contracts table contractId date price partId 1 20120121 10 1 2 20110130 9 1 3 20130101 15 2 4 20110101 20 2 最大的合同dat
  • Bootstrap 轮播与 morris.js 图表冲突?

    我正在使用 morris js 绘制图表 并且我想通过引导轮播显示这些图表 但是如果我这样做 Firefox 将停止响应 它们单独工作可以很好 但如果放在一起就会崩溃 firebug 告诉我有一些与 Raphael 图书馆有关的事情 但我仍
  • 适用于 Android 和 IOS 的 HighChart 库 [已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 Android 和 iOS 移动应用程序中使用 HighCharts Android 或 iOS
  • 将函数指针“转换”为 Objective-C 中的块

    我正在做一些从 Mono C 到 Obj C 的互操作 并遇到了这个问题 C 代码需要传递回调 它使用函数指针来执行此操作 我可以从 Obj C 端获取函数指针并调用它 一切正常 但我现在需要将该函数指针作为回调提供给第三方 API 该 A